技术论坛

一个自由口通信编程的实现流程

作者 主题
游侠

经验值: 428
发帖数: 56
精华帖: 0
主题:【分享】一个自由口通信编程的实现流程
推荐帖


只看楼主 楼主 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秒。

当发生掉站时,相当于站数变少了,轮询周期按正常通信计算。

 

另:关于做主站时优先级的处理的一点想法:

主站通信,一般是 发送---接收 的过程。发送完成了,从站可能会做出响应,在等待时间内一般不会重发,以避免冲突,这构成一个前提条件。

如果需要考虑优先级处理,可以在中间加几个优先级的判断条件:

    常规的:  发送-----接收      发送-----接收

加入优先级的:

     发送------接收  (最高优先级队列判断) (次高优先级队列判断)  发送---接收

     即 任何一次接收指令结束(或者超时结束),进行下一次常规轮询前,先判断优先级队列中的任务,按优先级等级分别建立队列,逐级判断。



个人浅见,请君指点!


 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1682619&b_id=64

至圣

经验值: 46065
发帖数: 11649
精华帖: 82
回复:一个自由口通信编程的实现流程
推荐帖


只看楼主 1楼 2021-02-25 16:34:54

高人啊。做得很好的。


 
以下网友喜欢您的帖子:

  

经验值: 300
发帖数: 41
精华帖: 0
回复:一个自由口通信编程的实现流程


只看楼主 2楼 2021-02-25 22:56:00
收藏一下,谢谢分享学习了!
一技绝尘
以下网友喜欢您的帖子:

  
版主

经验值: 20478
发帖数: 11221
精华帖: 31
回复:一个自由口通信编程的实现流程


只看楼主 3楼 2021-02-25 23:14:01

4、掉站处理是否有误?掉站只有正常通讯了,才能复位掉站标志,否则是复位掉站间隔定时器,继续处于掉站状态。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 11616
发帖数: 1595
精华帖: 0
回复:一个自由口通信编程的实现流程


只看楼主 4楼 2021-02-26 09:08:43

不错的示例,感谢分享


 
以下网友喜欢您的帖子:

  
游侠

经验值: 428
发帖数: 56
精华帖: 0
回复:一个自由口通信编程的实现流程


只看楼主 楼主 5楼 2021-02-26 09:20:08
以下是引用yanxiao在2021-02-25 23:14:01的发言 >3楼

4、掉站处理是否有误?掉站只有正常通讯了,才能复位掉站标志,否则是复位掉站间隔定时器,继续处于掉站状态。

确定掉站之后,在重试间隔时间内,后续的轮询会跳过这个站。

文中“重试间隔时间”意义:当某地址发生掉站之后, 进行间隔计时,间隔计时到之后,复位掉站标志,重新进入轮询排队,程序重新对该站发起通信,确定是否恢复正常,也可以外部复位掉站标志。


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2697
发帖数: 207
精华帖: 2
回复:一个自由口通信编程的实现流程


只看楼主 6楼 2021-02-26 09:25:10

这是一个很好案例,以后多学习。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5616
发帖数: 1180
精华帖: 0
回复:一个自由口通信编程的实现流程


只看楼主 7楼 2021-02-26 09:42:48


值得学习,谢谢分享。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 9457
发帖数: 1101
精华帖: 0
回复:一个自由口通信编程的实现流程


只看楼主 8楼 2021-02-26 12:21:37

不错啊,感谢分享


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 9648
发帖数: 2008
精华帖: 27
回复:一个自由口通信编程的实现流程


只看楼主 9楼 2021-02-26 12:46:07

不通用的东西没必要折腾浪费时间了。

逻辑写得再好,遇到不停更改需求的应用场景都得趴。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8221
发帖数: 1098
精华帖: 13
回复:一个自由口通信编程的实现流程


只看楼主 11楼 2021-02-26 17:12:02

感谢分享,流程还行,掉站故障处理还要优化下,有空也想想自由口的时序处理问题。


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1791
发帖数: 287
精华帖: 1
回复:一个自由口通信编程的实现流程


只看楼主 12楼 2021-03-10 20:00:00


感谢分享。


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
一个自由口通信编程的实现流程
×
扫描打开手机版
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。