作者 | 主题 |
---|---|
道草 游民 经验值:83 发帖数:43 精华帖:0 |
楼主 2011-03-15 11:42:24
主题:怎么检测WinCC与PLC的通信状态
怎么检测WinCC与PLC的通信状态
问:怎么检测WinCC与PLC的通信状态,当通信断开时在报警中显示“通信中断”,通信再次连接正常时在报警中显示“通信连接”,并计算出中间的间隔时间。 有一种方法:WINCC有函数可以获取变量的状态,得出一个32位无符号数,全为0时候通讯正常,可以试一下 答:可以将信号质量状态取出,进行编程 #include "apdefap.h" int gscAction( void ) { unsigned long status[1]; GetTagBitState("S7$Program(1)_Switch",&status[0]); //Return type :short int printf("%d",*status); if (*status==1) SetTagBit("ConnectionBool",1); //Return type :BOOL else SetTagBit("ConnectionBool",0); //Return type :BOOL return(0); } 也可以写成 DWORD state; GetTagBitState("PLC_WINCC_Comm", &state); if( state== 0) SetTagBit("Sta_PLCWinCCCommOK", 1); else SetTagBit("Sta_PLCWinCCCommOK", 0); 同时,wincc还要通知PLC与其链接正常,在上面脚本再加上 SetTagBit("Comm_toPLC", 1); 这一句将每两秒把Comm_toPLC这个tag置一,PLC收到这个tag为1就复位之,然后PLC逻辑通过延时检验15s一直没有收到1,那么就置位一个与WinCC链接中断的标志位。 DB100.DBX103.4 就是 WinCC内地Tag:Comm_toPLC,收到上升沿开始计数,DB100.DBX103.0是给回WinCC的,让WinCC知道通讯状态。也是扫描条件就绪的条件之一。不过DB100.DBX103.0这个WinCC用不大保险,还是WinCC自己检测Tag State比较靠谱。15s内如果还没有收到下一个WinCC发来的上升沿(如前所述WinCC每2s置1一次),证明通讯中断,PLC会set DB100.DBX103.0,扫描会中断。 ////////////////////////////////////////// 帮助中有: Value (decimal) Value (hexdecimal) Meaning 0 0x0000 No error 1 0x0001 Connection to partner not established 2 0x0002 Handshake error 4 0x0004 Network module defective 8 0x0008 Configured upper limit exceeded 16 0x0010 Configured lower limit exceeded 32 0x0020 Format upper limit exceeded 64 0x0040 Format lower limit exceeded 128 0x0080 Conversion error 256 0x0100 Tag initialization value 512 0x0200 Tag replacement value 1024 0x0400 Channel addressing error 2048 0x0800 Tag not found or not available 4096 0x1000 Access to tag not permitted 8192 0x2000 Timeout, no check-back message from the channel 16384 0x4000 Server not available. //////////////////////////////////////////////// 在从站向上位送的数据表中定义一位恒1的位。 代表从站通讯状态正常。 当通讯失败的时候,如果不刷新画面,在画面中应用这位的控件保持断开之前的状态1,只有从新刷新当前画面以后才会变成0. 所以不能用于检测Wincc与PLC的通讯状态。
知难行易
|