有一次编程,涉及到一个设定某系统运行时间,延迟关机的功能,设定时间在2小时到1秒钟不等。本来是用计数器做到的,但是后来想,是否能编写一个功能块,来实现小时、分钟、秒钟、毫秒分别输入,然后再转化成S5TIME格式的时间呢?或者把用毫秒表示的TIME格式转换为S5TIME时间,直接给时间继电器呢?
于是写了一个小小的FB,当然由于水平有限,很多语句没有怎么简化,请轻拍。
IN接口:HH为小时,MI为分钟,SS为秒,MS为毫秒,TTM为TIME类型时间,QH为转换切换开关,为0时执行标准转换,也就是转换HH,MI.,SS.MS四个数值,为1时转换TTM变量为S5TIME
OUT接口,输出ERR为错误字,JG为结果。类型是S5TIME类型。
临时变量,实际上貌似只用到了temp1。
第一段,将TIME类型放到temp1里面,并且判断转换开关是否打开,如果打开则跳过第二段将小时分秒毫秒组合的过程。
将小时分钟秒钟和毫秒组合成一个双整形数值,可以看成转为TIME类型数据,并放到temp1,如果切换开关为1时该段没有执行。
判断temp1的数值是否大于S5TIME能表示的最大数值99900000毫秒。S5TIME的时间最大为w#16#3999,时基3为10秒为单位,所以也就是是9990秒,也就是9990000毫秒, 2 h 46 m 30 s。当输入的时间大于这个时,输出错误码W#16#2,并且输出结果为最大的S5TMIE,O BR和ON BR并且SAVE是保证BR位为1,使得不管怎么样,这个块最后的ENO位都有使能,BE是道这里块就结束了,不在做下一步的转换。而如果没有大于,则继续做下一步的转换。
转换的时候先从最小时基开始,最小时基为10MS,则将TEMP1除以10,判断是否大于可用编码999,如果大于则跳转到下一个时基,如果不大于则开始转换过程。如果输入的数值小于10毫秒大于等于0秒,转换的过程将S5TMIE设置为10ms,并输出错误字W#16#1,这是为了保证如果上位输入例如7毫秒的时候,时间继电器没有延迟就启动或者不会启动输出的错误字可以认为是小于底限时间(在与0比较的时候使用了==I,其实不太准确,如果按照正确的输入应该是>=i小于等于0。但我想没有人输入负时间,而且触屏上也能限制,所以这里虽然不严谨也无伤大雅。),后面执行转换的时候,将temp1除以10,得到实际定时时间,并将这个时间与时基相与(OW),构建出S5TIME,并输出正确的数值,本来这个时基基本上不需要或字操作,但是为了和下面的程序相同,而且程序好看,还是坚持用了一个或字操作。其他的例如BR位处理、快结束和之前的理由相同。
这个和上面的理由相同,只是将时基改为了100ms
1S时基的S5TIME构建,程序和上面基本没区别。
10S时基的快构建。程序也差不多
这种程序可能在实际工作中很少用到,所以只是为了学习而做的,希望大家轻拍。
回复内容:
对: 乖乖小笨熊 这个也就是西门子才需要如此麻烦,其余大品牌直接就搞定了... 内容的回复!
其实这个程序当在写得时候忘记了一句,在程序段第二段的开始要用L 0 T TEMP1,否者之前的TTM填入的数值会影响到转换的结果。一时之间大意了。
西门子复杂的原因更多的是历史遗留问题,包括L指令,在寄存器里面的地址对应很奇葩的变成低地址对应高地址。传出也一样。所以当L 100 T md100执行后,有数值的位变成了MB103的2、5、6三位。这种数值存放方式很像是IBM-摩托罗拉体系的Power PC。所以用起来极不适应。而现在Power PC已经木有然后了。貌似这也算是西门子新系列PLC难产的原因吧?而新的Profinet出来后,发现也没有以太网的优势。要建立西门子S7连接如何如何,不能直接用IP地址么?个人的猜测也许是处理器对IP的不兼容,西门子采用了迂回策略解决了吧?要不然,真是各种难用啊。
回复内容:
对: 阿水--王者之师 我们设备上也个设备维修保养的倒计时,感觉没有楼主这... 内容的回复!
哦,这是做了一个标准的通用功能块,将时间转化为最高精度的S5Time,其实在实际应用中不需要那么麻烦,比如说如果只需要应用到精确的秒的时基,那么上位限制输入999秒,下位直接编程转换就可以了。这时候如果使用STL只要几句话,比如上位对应下位的MW40,编程就是
L MW40
BTI
L W#16#2000
OW
T MW42
MW42里面就是按照秒来为时基的时间。。不过想编写个通用块,能转换TIME类型的时间和将分时间转换为最高精度时间,也就是能用10MS定时器就用10MS定时器,能用100MS定时器就绝不用1S定时器而已。。纯属自己写着玩。