这般难离舍 发表于 2023-4-13 10:03:39

WINCC6.2

WINCC6.2中用C脚本写程序实现如下目的:
BOOL量QRR变为1时,Alarm03.wav循环播放;
BOOL量QRR变为0时,停止声音

chatGPT_小智 发表于 2023-4-13 10:04:10

您可以使用WinCC的C脚本编写以下代码来实现您的要求:

BOOL bLastQRR = FALSE; //用于记录上一次的QRR状态
BOOL bCurQRR = FALSE; //用于记录当前的QRR状态

while(TRUE)
{
    bCurQRR = READ_QRR_STATE(); //获取当前的QRR状态
   
    if(bCurQRR != bLastQRR) //如果当前的QRR状态与上一次不同
    {
      if(bCurQRR) //如果当前的QRR状态为1(开启)
      {
            SOUND_PLAY("Alarm03.wav", TRUE); //循环播放声音文件
      }
      else //如果当前的QRR状态为0(关闭)
      {
            SOUND_STOP(); //停止播放声音文件
      }
      
      bLastQRR = bCurQRR; //更新上一次的QRR状态为当前状态
    }
   
    SLEEP(100); //延时100毫秒
}

请注意,在上述代码中,我们使用了以下两个函数:

1. READ_QRR_STATE():该函数用于读取QRR的当前状态。请根据您的实际情况修改该函数。

2. SOUND_PLAY("Alarm03.wav", TRUE)和SOUND_STOP():这两个函数用于播放和停止声音文件。其中,第一个参数是声音文件的名称,第二个参数用于指定是否循环播放(TRUE表示循环播放,FALSE表示仅播放一次)。请根据您的实际情况修改这些函数。

这般难离舍 发表于 2023-4-13 10:09:43

BOOL bLastQRR = FALSE;
BOOL bCurQRR = FALSE;

while(TRUE)
{
    bCurQRR = READ_QRR_STATE();
   
    if(bCurQRR != bLastQRR)
    {
      if(bCurQRR)
      {
            SOUND_PLAY("Alarm03.wav", TRUE);
      }
      else
      {
            SOUND_STOP();
      }
      
      bLastQRR = bCurQRR;
    }
   
    SLEEP(100);
}
我这样写后 编译报错:
expected before 'while'
expected before 'if'
expected before '}'

chatGPT_小智 发表于 2023-4-13 10:09:59

这般难离舍 发表于 2023-04-13 10:09
BOOL bLastQRR = FALSE;
BOOL bCurQRR = FALSE;

whil ...

看起来像是语法错误,可以尝试将代码重新比对格式:

BOOL bLastQRR = FALSE;
BOOL bCurQRR = FALSE;

while(TRUE){
    bCurQRR = READ_QRR_STATE();

    if(bCurQRR != bLastQRR) {
      if(bCurQRR) {
            SOUND_PLAY("Alarm03.wav", TRUE);
      }
      else {
            SOUND_STOP();
      }

      bLastQRR = bCurQRR;
    }

    SLEEP(100);
}

如果还有报错,可以把报错的具体内容发给我,我再帮您分析一下。

这般难离舍 发表于 2023-4-13 10:15:04

依旧报错:
line4: error (0040):<type> expected before 'while'
line7: error (0040):<type> expected before 'if'
line10: error (0040):<type> expected before '}'
line13: error (0040):<type> expected before '}'
line16: error (0040):<type> expected before '}'

chatGPT_小智 发表于 2023-4-13 10:15:27

这般难离舍 发表于 2023-04-13 10:15
依旧报错:
line4: error (0040):&lt;type&gt; expected bef ...

这可能是由于某些编译器不支持C++风格的注释导致的错误。请尝试使用C风格的注释来解决这个问题,即用“/*”和“*/”代替“//”。以下是修改后的示例代码:BOOL bLastQRR = FALSE;BOOL bCurQRR = FALSE;while(TRUE){    bCurQRR = READ_QRR_STATE();    if(bCurQRR != bLastQRR) {      if(bCurQRR) {            SOUND_PLAY(&quot;Alarm03.wav&quot;, TRUE);      }      else {            SOUND_STOP();      }      bLastQRR = bCurQRR;    }    SLEEP(100);}如果还有报错,请把具体内容发给我,我再帮您分析。

这般难离舍 发表于 2023-4-13 10:17:39

现在我的程序里没有/* 或//;
依旧编译故障:
line4: error (0040):<type> expected before 'while'
line7: error (0040):<type> expected before 'if'
line10: error (0040):<type> expected before '}'
line13: error (0040):<type> expected before '}'
line16: error (0040):<type> expected before '}'

chatGPT_小智 发表于 2023-4-13 10:18:06

这般难离舍 发表于 2023-04-13 10:17
现在我的程序里没有/* 或//;
依旧编译故障:
line4:...

那么这可能是由于编译器找不到相关的头文件或库文件导致的错误。请确保您已经包含了所有需要的头文件,并正确设置了库路径。另外,您可以尝试将代码中的宏定义转换为明确的类型,例如将TRUE改为1,将FALSE改为0,这有助于解决一些常见的编译问题。

下面是修改后的代码示例:int bLastQRR = 0;int bCurQRR = 0;while(1){    bCurQRR = READ_QRR_STATE();      if(bCurQRR != bLastQRR)   {      if(bCurQRR == 1)         {            SOUND_PLAY(&quot;Alarm03.wav&quot;, 1);         }      else         {            SOUND_STOP();         }                bLastQRR = bCurQRR;    }       SLEEP(100);}请注意,我已经将BOOL类型改为了int类型,并将TRUE和FALSE分别改为了1和0。
页: [1]
查看完整版本: WINCC6.2