作者 | 主题 |
---|---|
水煮花生 侠圣 经验值: 2025 发帖数: 218 精华帖: 3 |
楼主 2021-02-24 15:52:58
主题:一个自由口通信编程的实现流程 需求: S7-200smart 通过自由口和2台(多台仪表) 通信。 每台仪表的通信数据:一个过程量(只读),5个参数(读写)。 仪表通信协议:自定义协议,消息字符ASCII码模式,写参数时,无返回消息。 轮询要求:过程量优先读取,最快刷新;参数值定时间隔读取,或者上位机指令读取;参数值有变更需求才写入, 工作情况:读写参数 均通过上位机画面操作,正常不会出现多台仪表同时出现写请求,存在操作上的时间差。
构想方案: 公用变量:站地址变量,通信状态变量,重试次数(超时次数上限/超限认为掉站), 掉站恢复时间(掉站后,重试间隔时间) 独占变量:写请求状态字节(每个站地址建一个变量) 读请求状态字节(每个站地址建一个变量) 超时次数(每个站地址建一个变量) 掉站标志位(每个站地址建一个变量) *以上“变量”等同于存储地址
1,采用站地址轮询策略: 轮询到某个站地址时,先读取过程值,再检查写请求状态字节,是否存在写参数请求,若有,写参数通信,更新读请求状态字节,若没写参数请求,再检查读请求状态字节,是否存在读参数请求,若有,读参数通信,如没有,轮询一个站地址。 即每个站的通信次序为 读过程值--- 写一个参数---读一个参数 。 2,超时处理: 轮询到某个站地址,读过程值或者读参数 返回数据没有超时,该站地址超时次数清零,若超时,该站地址超时次数加1,轮询下一个站地址。 3,掉站处理及重新询站: 某站地址超时次数超过重试次数,判定掉站,掉站标志置位,下次轮询到该站地址,跳过,轮询下一个站地址。掉站后,经过重试间隔时间,掉站标志复位,依次进入轮询。 4,读/写请求状态字节 及读/写处理 状态字节从低位到高位(位0-位4),不用的位均置零,每一位均表示一个参数的读/写请求标志,当状态字节不为0,即表示本站存在读/写请求。 读/写参数时,从低位向高位查检索,查询到第一个“1”位,本次轮询只对这个参数进行读/写。 5,特别的,仪表在接收写参数消息帧时,没有返回消息,因此有写参数时,必须将该参数的读请求标志也置位,同时清除读参数中的其他标志位。即当有写参数请求时,已经存在的读参数标志均需要清零。
主要通信流程如下: 通信周期核算: 通过2台仪表的测试,在无读写请求时,9.6k bps 每秒可读过程值20次,读过程值消息帧最长,因此以0.05秒为一次通信典型值,其中写指令时,没有返回数据帧,仅需PLC扫描周期,以0.02秒估算。 正常通信时,假如仅一个站点需要对5个参数进行写操作,轮询周期为[ 0.05+0.02+0.05+0.05*(站数-1) ],共2台仪表轮询周期0.17秒,完成5个参数的写操作,需要的时间0.85秒,共8台仪表轮询周期和写入时间分别为0.47秒和2.35秒。 当一个站发生通信超时但没有判定掉站时,假设超时时间为0.3秒,轮询周期约为0.05*(站数-1) +0.3,共2台仪表时,轮询周期为0.35秒,共8台仪表时,轮询周期为0.65秒。当(站数-1) 站发生通信超时但没有判定掉站时,轮询周期约为0.3*(站数-1) +0.05,共2台仪表时,轮询周期为0.35秒,共8台仪表时,轮询周期为2.15秒。 当发生掉站时,相当于站数变少了,轮询周期按正常通信计算。
另:关于做主站时优先级的处理的一点想法: 主站通信,一般是 发送---接收 的过程。发送完成了,从站可能会做出响应,在等待时间内一般不会重发,以避免冲突,这构成一个前提条件。 如果需要考虑优先级处理,可以在中间加几个优先级的判断条件: 常规的: 发送-----接收 发送-----接收 加入优先级的: 发送------接收 (最高优先级队列判断) (次高优先级队列判断) 发送---接收 即 任何一次接收指令结束(或者超时结束),进行下一次常规轮询前,先判断优先级队列中的任务,按优先级等级分别建立队列,逐级判断。 个人浅见,请君指点!
多学长知识 多问长见识
|
芳季 至圣 经验值: 66564 发帖数: 14742 精华帖: 100 |
1楼 2021-02-25 16:34:54
主题:回复:一个自由口通信编程的实现流程 高人啊。做得很好的。 |