qt udp多线程收发过程_STEP7如何与SC建立UDP通讯

本文介绍了如何在QT环境下使用UDP多线程进行数据收发,并结合STEP7详细阐述了与SC设备建立UDP通讯的步骤,包括配置UDT数据结构、创建DB块、调用FB65、FB66、FB67、FB68功能块等。
摘要由CSDN通过智能技术生成

dc9dead99df8e7f7eefb5c4446ce6126.png

申明:本文示例程序不能作为您在项目中编程标准,技术内容仅供参考

本文详细步骤阐述SIEMENS S7-300系列CPU如何利用STEP7建立与SC的通讯

等一下,神马?!都0202年了,你还教我用STEP7!人家都1500了你还在用300,真low

今天恬不知耻的炒个冷饭7a466110999506e13346d4c6e84bb3b2.png,万一有复古玩家呢

首先简介一下,UDP是神马

611e310cbd42cbbd547684438b017ddb.png

UDP是User Datagram Protocol的缩写,是一种无连接的数据传输协议

他与TCP/IP作为互补构成网络通讯的双子星,以下作为额外补充知识点

当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。 UDP适合于实时数据传输,如语音视频通信,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。例如:我们在看视频的时候偶尔丢一两个包也不影响体验。

1627d7f71426b7a9ef2f0228b56750f8.png

奇怪的知识突然增加了!最后一句话说的太妙,相当于你看一部电影偶尔丢一两个帧,你的眼睛是根本反应不过来,画面的流畅性没有受到影响啊!

UDP多年以没有可靠性保证、顺序保证和流量控制字段等,可靠性较差而著称,但数据传输过程中延迟小、数据传输效率高啊,,瞬间觉得UDP这么多年的锅可以不背了,UDP此刻在哭诉:我不是不负责,我只是为了快。。。

所以,快=不负责。。奇怪的知识又增加了。。

咳咳,回归正题,STEP7建立UDP通讯步骤大致分为:

  1. 建立UDP通讯所需的UDT数据结构

  2. 根据接口表创建用于接口变量收发数据的DB块

  3. 创建FB65,FB66,FB67,FB68功能块用于UDP数据收发

01

使用Open Communication Wizard向导配置UDT65,UDT66数据结构

UDT65,UDT66是什么(官话如是说)

UDT 65 "TCON_PAR",具有分配本地通讯接入点参数的数据结构
UDT 66 "TCON_ADR",具有分配远程伙伴寻址参数的数据

简单点说人话,UDT65就是一个数据结构包含了一些本地prot信息啊,你要用的是UDP这种功能啊之类,这个数据结构一会儿要给FB65用

UDT66是你要发送对象的IP和PORT,就是说SC的IP和PORT

那么什么是向导配置,向导就是导游,向导配置就是傻瓜配置,出去旅游报了团跟着向导走就行,走着走着你就变傻了

Open Communication Wizard就是我们的导游(文末附下载链接)

接下来带好遮阳帽,跟紧领队的小旗走

f2f8c72af3da4d1dd39bddd9941d5987.png

此处选择要生成UDT的项目目录

0d2931af492a5c190eee4960c521a848.png

New 一个

5963615b48f361ec054bef4e0d9f403c.png

选择UDP

a9343ed74306bd335f6dafac5d8bf8b3.png

此处告诉你A就是PLC, B就是SC

0e451b8a238cf997caff59e97127ab1c.png

此处connection ID为建立UDP通讯的序号,如果你建立多个UDP通讯建议从1开始,关键的地方是B下面,要填写SC(接收方的)的IP地址

85788f13e5bfc5f7b7fe76232ae346aa.png

给PLC和SC配置port,此处要与MOVIVITION中track designer里配置的SC块和PLC块的port一致

e16c1f2c294f8c88c1b8d8ff914f71e9.png

起名,建议就按UDT65,UDT66这么叫,简单直观

a384733bcf22f55bb902e80dab795226.png

OK收队

01198bb73b897070417f5aebeb31255c.png

此时打开你的项目将看到已经生成的UDT65和UDT66

2c0b96257c1407fb35d3feb4c3966a8e.png

我们再新建两个DB101和DB102定义变量类型分别为UDT65和UDT66,用于映射这两个结构体的内容

4d715c959cb0ead73af2822814e4507e.png

6466095369f6a8a9dd7e6c101af312cf.png

23f0061ffd7bab54f725e2ebcccdf71f.png

02

根据SEW所提供EXCEL接口表创建数据收发的DB块(也可建UDT)

举例,假如我们这里只有一台小车,一个小车定义有20个控制字和20个状态字

这里我们创建DB1001,对应小车vehicle 20个控制字CMD接口

创建DB1002,对应小车vehicle 20个状态字STA接口

19999afcbcf83452425266529a17fad4.png

17712fea381cef85365215124f8bd849.png

具体接口数据含义请详询专业工程师

    扩展阅读:MOVIVITION-PLC接口手册:

    MOVIVITION PLC interface-Chapter 5 Unit

03

在Libraries中,找到FB65,FB67,FB68,FB66,并在程序中依次调用(顺序不能乱)

FB65用于建立UDP端点

FB66 用于断开UDP端点

FB67用于发送数据,就是我们interface的CMD

FB68用于接收数据,就是我们interface的STA

93ccca3c56ee5d4895d353a2fb0af3c3.png

首先我们调用OB100程序上电即执行一个周期,来接通我们FB65的REQ,FB65的REQ上升沿即接通

FB65

CONNECT所需要的数据即UDT65

如果UDT65结构体正确,那么REQ上升沿即接通(一次就好)

de36f7ee9f89fdeed537fb985ec8149b.png

参数名参数说明
REQ上升沿触发建立通信连接
ID连接ID
CONNECT与变量类型为UDT65的变量相连
DONE为1时,连接正确建立
BUSY为1时,正建立连接
ERROR为1时,有故障发生
STATUS故障代码

FB67

07230fa9367d7cc9ad09cf8776428527.png

参数名参数说明
REQ上升沿触发
ID连接ID
LEN数据发送的最大长度
DATA数据发送的区域
ADDR接收伙伴的地址参数
DONE为1时,连接正确建立
BUSY为1时,正建立连接
ERROR为1时,有故障发生
STATUS故障代码

FB67为PLC向小车发送CMD控制字,这里REQ接通为导通,所以M100.0我们定义为100ms的脉冲信号,即每个100ms发送一次数据,LEN为数据长度,这里48即为 20*2个控制字节 + 8 个报头字节 = 48 ;DATA为小车的4个报头字 + 20个控制字的实际数据 ;ADDR为UDT66数据导入,即SC地址

    如果项目较大的话,有很多vehicle,每个vehicle 20个字,36个vehicle就是720个字,1440个字节,LEN就是1448,这已经是比较极限的发送量了,那么如果大于36个vehicle的数据怎么办呢?再建一个UDP通讯呗!

FB68

07bdfc9f47a35cc6bac1bca08c509050.png

参数名参数说明
EN_R为1时使能
ID连接ID
LEN接收区域的长度
DATA接收数据区
ADDR发送伙伴的地址参数
NDR为1时,接收完成
BUSY为1时,正在接收
ERROR为1时,有故障发生
STATUS故障代码
RCVD_LEN实际接收的数据长度

这块设置其实与FB67类似,一发一收,不多赘述了

FB66

22aeb8684c895058c48dab11832ec758.png

参数名参数说明
REQ上升沿触发
ID连接ID
DONE为1时,断开连接完成
BUSY为1时,正断开连接
ERROR为1时,有故障发生
STATUS故障代码

REQ导通即切断,考虑一下,你在什么情况下需要切断通讯吧

04

最终建立和生成的功能块(不是标准,仅供参考,不值模仿)

b10376535a3e75599eb0b372312b6508.png


运行PLC程序,MOVIVITION端监控通讯成功状态

327072813c002d070d8b223087c05e7f.gif

建好通讯只是万里长征的第一步,要想实现控制,了解系统功能,请详询专业技术工程师


参考资料

https://support.industry.siemens.com/cs/document/90468531/使用-open-communication-wizard-建立开放式udp-通信?dti=0&lc=zh-CN

https://support.industry.siemens.com/cs/document/29738463/如何编程通讯块-fb67“tusend”%EF%BC%8Cfb68-“turcv”%EF%BC%8Cfb65“tcon”和-fb66“tdiscon”以实现?dti=0&lc=zh-CN

Open Communication Wizard下载链接

https://support.industry.siemens.com/cs/document/98957840/创建用于开放式-tcp-ip-通信的连接数据的向导-(开放式通信向导)?dti=0&lc=zh-CN


扩展阅读

MOVIVITION PLC interface-Chapter 4

MOVIVITION PLC interface-Chapter 5 Track

MOVIVITION PLC interface-Chapter 5 Unit

MOVIVITION PLC interface-Chapter 5 Switch

MOVIVITION PLC interface-Chapter 5 Station

[Python详解]如何发送高度表

MOVIVITION PLC interface-Chapter 7 Height table


afb9c460be858f130500f205c9858e47.gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,我们可以使用多线程来进行UDP收发操作。以下是一个简单的示例: 首先,我们需要创建一个UDP接收线程和一个UDP发送线程。 UDP接收线程可以继承自QThread类,并重写其run()函数。在run()函数中,我们可以创建一个QUdpSocket对象,并使用bind()函数将其与指定的IP地址和端口号进行绑定。然后,我们可以使用readyRead()信号来检测是否有新的数据到达。一旦有新的数据到达,我们可以使用receiveDatagram()函数来接收数据,并通过信号和槽机制将数据传递给主线程进行处理。 UDP发送线程也可以继承自QThread类,并重写其run()函数。在run()函数中,我们可以创建一个QUdpSocket对象,并使用writeDatagram()函数来发送数据。 在主线程中,我们需要创建一个UDP接收线程的实例和一个UDP发送线程的实例,并将其启动。然后,我们可以通过信号和槽机制将接收到的数据传递给其他需要处理该数据的部分。 需要注意的是,在使用多线程进行UDP收发操作时,我们需要保持数据的同步和线程安全。可以使用互斥锁(QMutex)来控制多个线程对共享资源的访问。 总结起来,使用多线程进行UDP收发操作需要创建UDP接收线程和UDP发送线程,并在主线程中进行线程的管理和数据的处理。通过合理使用信号和槽机制以及互斥锁,可以实现线程间的数据传输和同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值