如果有这样一个需求,我的驾驶舱系统需要根据PLC的时间计算OEE,或者在一定的时间内执行某个操作时,或者到达某个时间不让客户再继续使用PLC的操作。(文中图的水印为自己之前公众号的名字,现在已更改为上位机自动化技术研究)
总之就是要获取PLC的时间或者根据时间操作PLC,要怎么做?
我们目前想过两个方案:
1)配套上位机或者直接mes对PLC进行点位True或者false的状态切换,去执行相应逻辑
2)PLC内部进行时钟计算,时间到后,根据需求去做相应逻辑操作。
为了能够做两套设备进行切换以防上位机突然宕机导致PLC的某些逻辑无法操作,这个时候就需要再在PLC内部自己做一个系统时钟获取。而且一开始操作的时候,是需要根据当前所在时间先去初始化时钟的,说明书中如下
实际操作就是
然后修改一下时钟设置一下初始化就好了。
PLC内部存在一个RTC芯片,这块芯片在PLC断电之后仍然还是会执行一段时间的。
那么有人可能会问,PLC如果断电了,该怎么办。如果不带外部时钟电池的话,会有超级电容进行供电的,如果有的话会有电池。但是这个寿命还是需要看具体手册来定。
那我们做这个块的目的呢,就是为了能够实时去自由操作PLC的时间。而不需要再通过以上方法自己去获取和同步,有了信号源,上位机可以修改也可以自由操作去读取。
实现原理
先看一看西门子200Smart中对于时钟的读取和写入的命令块:
1)读取时间逻辑:给一个脉冲上升沿信号(可以是时钟脉冲),然后利用指针*Address指向Address首字节的地址,把当前时间读取到这个地址。
2)又由于读取出来的数值是采用BCD码存储的,为了让人可以懂得什么意思,转换为人看得懂且好操作的整型。按照顺序分别是——>第一个地址是年,第二个是月,依次类推,第6个地址是秒。
3)写时间刚刚好是反过来的,需要把year转换为bcd形式,然后通过系统自带的Set_RTC指令来进行时钟的改变。
实现步骤
1)新建一个子程序,命名为System_Time
2)新建一个变量表如下
3)程序开始实现如下
读:
写:
最后使用的时候就是,注意一般在CPU中是以16进制表示的,所以进行时钟比较的时候也是需要用16进制,而显示在代码块中数值是转换后的10进制数字。
当需要使用这个时间的时候,注意年是只有显示24,比如2024年的时候,然后其他的如果是要得到相对应的值的话,只需要去存入地址首地址那边再根据T字节的顺序,指针指定位置后移位去找就好了。