登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:关于PLC中的轮换程序及累计时间和变量存储。

点击:6609 回复:10

作为一个施耐德PLC初学者,真的是在网上好难找到案列,倒是西门子和三菱的一抓一大把。目前接触到的主要是somachine4.1/somachine basic以及触摸屏VIJEO DESIGNER及Basic,囫囵吞枣的做完6个简单项目的设计/编程及调试,一路下来有几个问题一直想请教大家,想看看大家有什么经验,也请帮看看我处理的是否合适。
尤其颜色标出部分想看看大家的意见。
1) somachine中有用于隐含检查的子程序POU,譬如:边界检查CHECKBOUNDS, 除数divisor检查函数CHECKDIVDINT, CHECKDIVLINT, CHECKDIVREAL, CHECKDIVLREAL.
字面理解主要是检查bounds边界,检查LINT,DINT,REAL和LREAL类型数据的除数是否为0,那么bounds指的是什么边界呢? 譬如我一个4~20mA信号对应的数字量上下限分别为0和4164,那么难道它会检查出来实际的数字量低于0或者高于4164吗?
关于除数,下面有一段对应的程序
IF divisor = 0 THEN
CheckDivLInt:=1;
ELSE
CheckDivLInt:=divisor;
END_IF;
如果发现除数为零,这是我要让这个错误在HMI上显示,可以直接将“CHECKDIVLINT”作为一个变量提取出来通过其等于1来让错误输出吗?
2) 轮换交替换工作时,我设置了按照启动次数和启动时间两个参考因素,通过HMI触摸屏认为切换选择不同的轮换模式。
为确保几台电机的工作时间一致,我用了Blink脉冲信号,譬如如果要以1h作为一个高/低电平时间,自动状态下通过水位信号来触发,但blink的时序还不清楚什么样的,如果时间没到1h,譬如只到30m后,水位下去了水位信号就没了,那下次启动时blink是继续未完成的30m后再转换到低电平还是已经就是低电平?
下图是轮换部分程序,大家看看是否可行,或者有没别的更好办法?
附件 轮换.jpg
3) 关于累计工作时间,我不知道下图写的是否有毛病?或者somachine里有没对应的功能块啊?
附件 时间.jpg
4)如果PLC的输入变量也要通过485通讯到HMI人机界面,我先前常规的笨办法是:1)输入是BOOL变量直接再通过一线圈中继,中继的输出直接以%MW寄存器地址赋值;整数/实数等变量是直接在全局变量里定义%MW地址。2) 直接通过ST结构化文本语言将%IW赋值给MW%,如:%MWxx:=%IWxx;
这两种方法优缺点在哪?485通讯的话变量必需要经过中间寄存器吗?

最后修改:2018/4/14 16:32:01
18-04-14 14:17
知道施耐德PLC用的人不多,但多少了解点的高手总该有不少吧?表情
18-04-14 16:33
很多年前我用过施耐德的昆腾,使用的是Unity,你用的软件我没用过。不过施耐德的plc除了小型的外都还是很好用的,我觉得和西门子很类似。
485通讯不是非得通过某个寄存器,只是为了提高通讯效率一般不会把输入输出等需要通讯的数据分别传送,而是把需要通讯的数据映射到一片存储区,经过比较少次数的通讯就可以完成。
最后修改:2018/4/14 19:24:17
18-04-14 19:23
1、CHECK_BOUNDS用于检查数组的边界。
 针对于除数为0的检测功能块,如果你直接使用返回值来在触摸屏显示错误提示,我认为因为原功能块并不能排除除数为1的状况,也就是说,它认为用户不会有除以1的想法。
 与其判断输入值和函数的返回值,不如直接限制出现除数为0的状况更好一些。
附件 snap1.jpg
2、通过对BLINK功能块的监视,你会发现其内部实现只是一个普通定时器来实现的,因此它没有掉电保持的功能,就你这个功能来说,我认为构建一个1S定时器然后通过每一秒累加后并比较更容易实现累计以及按时间轮换的功能。
附件 snap2.jpg
3、IEC定时器最长可以定时49天,如果你构建分钟的话,你会获得更长的时间,读取两次系统时间并作减法得到运行时间也可以。
4、从以往的经验告诉我,485通讯并不需要使用内部寄存器,但是使用内部寄存器一个明显的好处就是:例如你需要一个输入信号为常闭,通常的做法是用线去短接或者使用编程软件去强制,无论哪种方法,都会非常麻烦,通过中间寄存器,我可以赋值而不需要去和硬件打交道。
Good Luck~
最后修改:2018/4/16 9:48:41
18-04-14 19:33
非常感谢!!!!!!!,我说下我对您的答复理解,还麻烦您再看看我理解的是否有问题?
1)我理解了,意思就是不排除除数为1,但这个子程序定义可以按照你后面编写的去重新定义,修改后的就是我想表达的意思了是吧,修改后应该就可以直接调用CheckDivLInt这个变量了吧。
2)BLINK不具备掉电保持功能,所以最好用1s的定时器去叠加,这样即使水位信号出发后掉电了也就是掉了1s的时间,不影响继续累加是吧。
3)如果读取系统时间,有个疑问就是如何通过运行信号来控制系统时间的取值,这点还不会表情,你能举个简单的例子吗?
4)这个主要是从后期系统调试方便角度而言,不用去现场或者在输入端改变信号。
表情表情表情
18-04-16 16:25

引用 cvlsam 在 2018/4/14 19:33:35 发言【内容省略】

这位是真大神,万事通,各种各品牌,各种工控玩意儿都会整。。牛啊。
真人才
18-04-16 19:03
1、Check_Div_Lint是一个功能FC,你触摸屏如何去连接一个FC的地址呢?你需要重新包装一下,例如:
  varIsZero := Check_Div_Lint();
2、当你使用累加(ADD),那么只要你的数据地址是保持的,你就可以继续累加。
3、当运行时读取一次系统时间,保存在DateTime(DT)类型的变量中,例如PrevTime,当结束时再次读取,两次时间差就是你运行时间。
4、其实是为了将硬件与软件层次进行隔离,即使不连接硬件,你依然可以对程序进行测试,同时因为不涉及硬件,你的程序可以在各个机型中通用。
Good Luck~
18-04-16 19:07

引用 cvlsam 在 2018/4/16 19:07:42 发言【内容省略】

谢谢,我自己回去看看资料在摸索摸索,再次谢谢您的指导!
18-04-17 08:01
统计累积运行时间最好不要使用读系统时间做时间间隔的方式,比较麻烦。原因是:两次读取系统时间之间你如何知道系统一直是正常运行没有掉电停机的呢?会出现比较大的统计误差。
就用秒脉冲来统计,统计值设为保持类型,这样最小误差控制在1秒左右。
18-04-19 08:56

引用 xiatianyun 在 2018/4/19 8:56:57 发言【内容省略】

长时间秒脉冲统计要考虑数据溢出的情况,例如1秒左右只能累积49天,而且部分品牌PLC数据保持依靠电池或电容,这也要考虑的。
对于读取系统时间掉电停机,目前大多数PLC都有非正常停电的中断,程序员可以在其中处理这种情况。
Good Luck~
18-04-19 09:13

上一页下一页

工控新闻

更多新闻资讯