Ни для кого не секрет, что разработчики IDE для HMI твердо убеждены, раз вы пишите визуализацию, то ПЛК у вас в шаговой доступности, и HORN (аварийный рев) вы и организуете через ПЛК. Но это далеко не всегда так, и почему не дать внятный инструмент для запуска звука на PC - я не понимаю. Причем сколько IDE я не пробовал, всюду одно и то же.
Вот и в WinCC. Тут я новичок, с языками опыта маловато, поэтому радуюсь всякой маленькой победе, и спешу поделиться.
Делаем две Project Function
Код: Выделить всё
BOOL GetProjectPath(char* lpstrProjectPath)
{
BOOL bRet = FALSE;
char szProjectFile[_MAX_PATH+1];
char* psz = NULL;
CMN_ERROR Error;
bRet = DMGetRuntimeProject(szProjectFile,_MAX_PATH+1,&Error);
if (bRet == FALSE)
{
return FALSE;
}
psz = strrchr(szProjectFile,'\\');
if (psz == NULL)
{
return FALSE;
}
*(psz+1) = 0;
strcpy(lpstrProjectPath,szProjectFile);
return TRUE;
}
Код: Выделить всё
#include "apdefap.h"
void CC_PlaySound(char* lpszSoundFile,INT iPlay)
{
#pragma code("winmm.dll")
BOOL PlaySound(LPCSTR lpszSound,HMODULE, DWORD dwSound);
#define SND_FILENAME 0x00020000L
#define SND_ASYNC 0x0001
#define SND_LOOP 0x0008
#pragma code()
BOOL bRet = FALSE;
BOOL bSound = GetTagBit("Sound");
char szProjectPath[_MAX_PATH];
char szSoundPath[_MAX_PATH];
GetProjectPath(szProjectPath);
sprintf(szSoundPath,"%sSound\\%s",szProjectPath,lpszSoundFile);
if (iPlay == 1)
{
bRet = PlaySound(szSoundPath,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
}
else
{
bRet = PlaySound(NULL,NULL,SND_FILENAME);
}
if (bRet == FALSE)
{
MessageBeep((WORD)-1);
}
PS Нисколько не скрываю, что скрипты стырены с различных источников. Но момент допиливания присутствовал ;) Да и в готовом виде, в отдельном топике - считаю: теме быть