QabStatePLC[0] := QSTOP; // 1=Stop
QabStatePLC[1] := QSTARTING; // 1=Starting
QabStatePLC[2] := QRUN; // 1=Run
QabStatePLC[3] := QSTOPPING; // 1=Stopping
QabStatePLC[4] := 0;
QabStatePLC[5] := QCMD_ON; // PLC output
QabStatePLC[6] := 0;
QabStatePLC[7] := 0;
QabStatePLC[8] := QMON; // 1=Feedback Monitoring ON
QabStatePLC[9] := QMON_ERR; // 1=Error Feedback Monitoring
QabStatePLC[10] := 0;
QabStatePLC[11] := 0;
QabStatePLC[12] := QMPS; // 1=Motor Protecting Switch
QabStatePLC[13] := 0;
QabStatePLC[14] := 0;
QabStatePLC[15] := 0;
QabStatePLC[16] := QMAN_AUT; // 0=Manual 1=Automatic
QabStatePLC[17] := QREMOTE; // 0=Local 1=Remote
QabStatePLC[18] := SIM_ON; // 0=Process 1=Simulation
QabStatePLC[19] := 0;
QabStatePLC[20] := QFB_ON; // Feedback Running
QabStatePLC[21] := 0;
QabStatePLC[22] := 0;
QabStatePLC[23] := 0;
QabStatePLC[24] := QERR; // 1=Error
QabStatePLC[25] := QERR_EXT; // 1=External Error
QabStatePLC[26] := QLOCK; // 1=Motor Locked;
QabStatePLC[27] := LOCK; // 1=INTERLOCK
QabStatePLC[28] := 0;
QabStatePLC[29] := 0;
QabStatePLC[30] := 0;
QabStatePLC[31] := 0;
以上是我的电机的状态双字,电机图标显示了电机的运行状态(停止,运行,正在启动,正在停止,故障),电机的操作模式(手动,自动,远程,仿真),下面是成品图标式样。
(1)
(2)
(3)
(4)
(3)停止
(2)/(3)交替闪烁为正在启动
(2)/(1)交替闪烁为正在停止
(1)运行
(4)故障
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这么“高大上”的电机图标的原材料:
1个IO域,
1个文本,
1个圆圈。
还有一个多边形小箭头!~

然后组成自定义对象,添加属性
- IO添加Output value属性,用于连接PLC上传的电机状态双字
- 文本添加text属性,用于显示“M”“A”“L”“S”手动/自动/就地/仿真
- 圆圈添加背景色,填充色,填充色闪烁,背景色闪烁开颜色,背景色闪烁关颜色,对应的英文为BackColor,FillColor,FlashBackColorOff,BackFlashColorOn

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后就是状态显示的脚本

WinCC在状态双字的变化时执行以下脚本:
#include "apdefap.h"
void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, double value)
{
#define BIT(i,status) (((DWORD)(double)status&1<<i)!=0)
BOOL show1,show2,show3,show4;
DWORD szStatus;
show4 = FALSE;
show4 = BIT (24,value) ; //ERROR位为Bit24
szStatus = (DWORD)value&0xF; //获取电机的运行状态Bit0~3,1=Stop,2=Starting...
switch(szStatus)
/*颜色代码 灰(808080),浅灰(D3D3D3D3),白(FFFFFF),浅绿(00FF00),绿(008000),红(FF)*/
{
case(1): //Stop
SetPropDouble( lpszPictureName, lpszObjectName, "BackColor",0x808080);
SetPropDouble( lpszPictureName, lpszObjectName, "FillColor",0xFFFFFF);
SetPropBOOL( lpszPictureName, lpszObjectName, "FlashBackColor",0);
break;
case(2)://Starting
SetPropBOOL( lpszPictureName, lpszObjectName, "FlashBackColor",1);
SetPropDouble( lpszPictureName, lpszObjectName, "BackFlashColorOn",0x00FF00);
SetPropDouble( lpszPictureName, lpszObjectName, "BackFlashColorOff",0x808080);
break;
case(4)://Run
SetPropDouble( lpszPictureName, lpszObjectName, "BackColor",0x008000);
SetPropDouble( lpszPictureName, lpszObjectName, "FillColor",0x00FF00);
SetPropBOOL( lpszPictureName, lpszObjectName, "FlashBackColor",0);
break;
case(8)://Stopping
SetPropBOOL( lpszPictureName, lpszObjectName, "FlashBackColor",1);
SetPropDouble( lpszPictureName, lpszObjectName, "BackFlashColorOff",0x008000);
SetPropDouble( lpszPictureName, lpszObjectName, "BackFlashColorOn",0xD3D3D3);
break;
}
if (show4) //故障,显示红色
{
SetPropDouble( lpszPictureName, lpszObjectName, "BackColor",0xFF);
SetPropDouble( lpszPictureName, lpszObjectName, "FillColor",0xFFFFFF);
SetPropBOOL( lpszPictureName, lpszObjectName, "FlashBackColor",0);
}
show1 = FALSE;
show2 = FALSE;
show3 = FALSE;
show1 = BIT (17,value) ; //就地,优先显示
show2 = BIT (16,value) ; //手自动
show3 = BIT (18,value) ; //仿真,最优先显示
if (show3)
SetPropChar( lpszPictureName, lpszObjectName, "MotorMode","S"); //Simulation on
else
{
if (!show1)
SetPropChar( lpszPictureName, lpszObjectName, "MotorMode","L"); //local mode
else
{
if (show2)
SetPropChar( lpszPictureName, lpszObjectName, "MotorMode","A"); //automatic mode
else
SetPropChar( lpszPictureName, lpszObjectName, "MotorMode","M"); //manual mode
}
}
}