有下面的工况:
在某个设备(姑且称之为A)监测范围内存在N个信号,A就有能力识别到此N个信号。控制器(PLC)与A通讯,可以判断监测范围内存在有哪些信号,问题是PLC怎样判断监测范围内已有的信号真正离开了检测范围?
目前想到的办法是PLC只要检测到某个信号就马上置位一个M,表明此信号已经出现在监测范围内(这个逻辑要求已经写了出来,没有问题)。
置位M后马上启动一个时间继电器,启动条件中间串联一个此信号消失的节点,时间到后就复位M,即就是在一个时间段内一直没有接收到某信号存在的数据就认为这个信号已经离开了此区域。
如果需要检测的信号是海量的话,这个逻辑是不是无法写下去了(太多程序段啊!)?
大家有什么好的处理办法?
以下是我以5个信号为例子写的逻辑。如果有上万个信号,岂不是PLC无法完成这样的任务了?
楼主最近还看过
可能还有些人看不明白,我重新描述一下工况:
因为是串口过来的数据,所以PLC接收寄存器(图片中的D113)接收到的是不断变化的N个数据信息。
可以理解成PLC与无线读卡器通讯,在覆盖监测区域内有1#卡存在就接收到1;有2#卡存在就接收到2……,存在很多卡的话,D113中就会接收到不断变化的数据1、2……,检测区域内没有任何卡存在,那么D113中接收到的数据就是0。
现在要使用PLC判断监测区域内有那些卡存在(例如人员身份信息),这个都不是问题,关键是那些卡离开了监测区域不好判断,使用图片中的逻辑,一个个写的话就有点力不从心了。(因为需要给出一个时间段,用时间点无法判断)
首先假设有N个信号可能在允许时间段内出现,那么就分配N个数组。
数组包含,信号标识符(标识符是唯一的),存在时间,两个寄存器(当然信号标识符也可以是寄存器位,以实际需要决定)。信号标识符与标识符寄存器地址之间保持严格的对应关系,这点很重要,主要是保证标识符寻址的便利性)。
当从通信中接收到某个标识符后,就开始对这个标识符的存在时间开始计时,计时不采用定时器,而采用定时中断加计数。
然后对N个标识符寄存器进行连续的扫描,如果标识符存在(表面改信号已经被侦测到),如果时间溢出,那么表示改信号已经离开,清空标识符。如果再次侦测到该标识符,则对存在时间置零。
上面使用标识符寄存器固定对应信号标识符,内存空间开销有点大。
如果允许时间内出现的信号不多,但总的信号仍然是N个,那么就可以使用浮动标识符寄存器。某个信号一出现,就随机的把内存中的某个数组分配给他,又一个信号出现时又分配一个数组给他。当对标识符寄存器进行扫描,发现存在时间溢出表示信号离开后,清空这个数组空间,留给下一个即将到来的信号。
浮动标识符方式,可以利用一次扫描过程完成标识符分配、存在时间加计数、时间溢出判断、清空标识符等工作。
这些工作只需要你用一个简短的定时中断子程序来完成,不需要重复编程。
不管怎样,PLC的速度都必须的快。这样中断子程序执行速度才够快。比如定时中断子程序的执行速度为1mS,1S内也就只能扫描1000个信号。如果要在1S内扫描1W个信号,则必须在中断子程序中处理10个信号。
总之,速度要快、内存空间要大。