众所周知S7-200 SMART PLC本身既不支持SIMATIC对时也不支持NTP对时,当需要它与WINCC系统时间一致时该怎么办?
1.描述
本文给出一种使用WINCC的C脚本把时间写到PLC变量,这些变量作为"Date_And_Time"数据类型值(以BCD码编码)被调用,通过指令“SET_RTC" 设置PLC时间。
2.PLC程序
PLC程序比较简单:
例子程序,WINCC下发的时间放在MB10-MB17,MB18为时间设置使能。读取的PLC时间放在MB20-MB27。关于READ_RTC/SET_RTC 指令更多信息,可查看”STEP 7-Micro/WIN SMART 在线帮助“。
3.添加条目与变量
配置WINCC通过Simatic Net OPC 连接S7-200 Smart PLC,在此就不叙述,网上资料很多。如果你遇到什么问题可以留言。
OPC SERVER添加条目
添加设置时间地址条目(对应MB10-MB18),Data type为B(byte)
添加读取时间地址条目(对应MB20-MB27),Data type为DT
OPC CLIENT添加变量
通过浏览服务器添加读取时间变量(数据类型为”日期/时间“),设置时间变量(数据类型为”原始数据类型“)
4.WINCC脚本
画面添加一时间控件用来显示pc时间,一I/O域显示PLC时间,一按钮触发对时脚本
设置PLC时间C脚本:
#include "apdefap.h"void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){ #pragma code("kernel32.dll");void GetLocalTime(SYSTEMTIME *lpst);#pragma code();
SYSTEMTIME pctime;BYTE A[9] = {0};BYTE B[9] = {0};int i;int tmp1;int tmp2;
//读取pc本地时间GetLocalTime(&pctime);
A[0]=pctime.wYear-2000;A[1]=pctime.wMonth;A[2]=pctime.wDay;A[3]=pctime.wHour;A[4]=pctime.wMinute;A[5]=pctime.wSecond;
//8位整数值转成BCDfor(i = 0;i<6;i++) { tmp1 = A / 10; tmp2 = A % 10; B = (tmp1 << 4) | tmp2;}
//时间设置标志B[8]=1;
SetTagRawWait("set200smartplctime",B,9); //Return-Type: BOOL
}
注意:
上面的方法只能进行时间设置而不能完成时间同步的功能。因为必须考虑到延迟,比如报文的处理时间,C 脚本的运行时间等,PLC程序执行时间,因此这个方法在精度方面不如真正的时间同步精确。
还要注意时间跳变(向前/向后)的发生,这就意味着这个方法不适用于必须按时间正向顺序的应用。
推荐阅读:
若觉得文章对你有帮助,随手点在看、分享,也是支持和鼓励。
扫描下面二维码、关注后,在底部菜单中可查看更多内容!
长按识别图中二维码关注