| 作者 | 主题 |
|---|---|
|
宁超 至圣 经验值:11565 发帖数:1009 精华帖:39 |
楼主
主题:【分享】“高大上”的电机图标
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; 以上是我的电机的状态双字,电机图标显示了电机的运行状态(停止,运行,正在启动,正在停止,故障),电机的操作模式(手动,自动,远程,仿真),下面是成品图标式样。 (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 } } } |