首页 历史故事自由口协议通信:实现灵活高效的数据交互

自由口协议通信:实现灵活高效的数据交互

【摘要】:CM1241 RS232和CM1241 RS485接口模块都支持基于字符的自由口协议,下面以RS232模块为例介绍串口通信模块的端口参数设置、发送参数设置、接收参数设置以及硬件标识符。RS485通信模块没有流控制功能。图8-37 端口参数设置硬流控Hardware RTS always switched通信模块发出TRS请求发送信号后持续检测来自通信伙伴的CTS允许发送信号,以判断通信伙伴是否能接收数据。图8-40 SEND_CFG指令块表8-6 SEND_CFG参数含义3.串口通信模块的接收参数设置在串口通信模块接收数据之前,必须对模块的接收参数进行设置。

CM1241 RS232和CM1241 RS485接口模块都支持基于字符的自由口协议,下面以RS232模块为例介绍串口通信模块的端口参数设置、发送参数设置、接收参数设置以及硬件标识符。最后通过一个简单的例子介绍串口通信模块自由口通信的组态方法。

1.串口通信模块的端口参数设置

在项目视图左侧的项目树中双击“设备配置”,打开设备视图,拖动RS232模块到CPU左侧的101槽,在RS232模块的属性对话框中设置串口通信模块的参数。

端口组态属性如图8-37所示,其中“波特率”项用于指定通信的波特率,默认值为9.6 kbit/s,可选值为300 bit/s、600 bit/s、1.2 kbit/s、2.4 kbit/s、4.8 kbit/s、9.6 kbit/s、19.2 kbit/s、38.4 kbit/s、57.6 kbit/s、76.8 kbit/s、115.2 kbit/s。“奇偶校验”项用于设置校验,默认为无校验,可选项为无校验、偶校验、奇校验、传号校验(奇偶校验位为1)和空号校验(奇偶校验位为0)。“数据位”默认为8位/字符,可选项为8位/字符和7位/字符。“停止位”用于设置停止位的长度,默认为1,可选项为1、2。“流控制”项默认为无,可选项为XON/XOFF、硬件RTS始终为打开(Hardware RTS always ON)、硬件RTS始终打开(Hardware RTS always switched)。如果选择软流控XON/XOFF,则可设置XON和XOFF分别对应的字符,默认为0x11和0x13。流控制是用来协调数据的发送和接收的机制,以此确保传输过程中无数据丢失。RS485通信模块没有流控制功能。4种流控制选项详细说明如下所述。

978-7-111-34922-8-Chapter08-45.jpg

图8-37 端口参数设置

(1)硬流控Hardware RTS always switched

通信模块发出TRS请求发送信号后持续检测来自通信伙伴的CTS允许发送信号,以判断通信伙伴是否能接收数据。如果检测到CTS允许发送信号,则在CTS允许发送信号期间通信模块就持续发送数据。如果在发送数据期间CTS允许发送信号消失,则通信模块立即停止发送数据,并开始等待CTS允许发送信号的再次出现。如果等待时间在设定时间之内,则通信模块继续发送数据,如果等待时间超过设定时间,则通信模块停止数据发送并返回一个错误。

(2)硬流控Hardware RTS always ON

通信模块总是激活TRS信号。此选项常用于与MODEM的连接。

(3)DTR和DSR的使用

通信模块在使用硬流控时激活DTR信号,当DSR信号激活时发送数据。通信模块仅在发送操作开始时检测DSR信号,即使在数据发送过程中DSR信号消失,也不会停止数据发送。

(4)软流控中的XON和XOFF

XON和XOFF的作用与硬流控中的RTS和CTS相同。软流控要求通信模块工作在全双工模式下,因为接收对象需要在传输数据的同时发送XOFF给发送对象。

“等待时间”默认为1 ms,可选值为1~65535 ms。等待时间是指在模块发出RTS请求发送信号后等待接收来自通信伙伴的CTS允许发送信号的时间,如果该时间超过设定值,则通信模块会终止发送操作并返回一个错误。如果该时间未超过设定值,则通信模块在等待时间结束后开始发送数据。对于软流控,等待时间是指发送XOFF信号后等待接收XON信号的时间。

除了通过界面来配置RS232/RS485端口,也可以通过PORT_CFG指令块来动态配置,如图8-38所示,其参数含义如表8-5所示。需要注意的是,通过PORT_CFG设置的参数会覆盖图8-37所示的端口参数设置,但该设置在掉电后不保持。

978-7-111-34922-8-Chapter08-46.jpg

图8-38 PORT_CFG指令块

表8-5 PORT_CFG参数含义

978-7-111-34922-8-Chapter08-47.jpg

2.串口通信模块的发送参数设置

在串口通信模块发送数据之前,必须对模块的发送参数进行设置。在设备视图的通信模块属性对话框中选择“传送消息组态”项可以设置发送参数,如图8-39所示。其中,“RTS接通延时”参数仅在“端口组态”中选择硬流控时有效,表示在发出“RTS请求发送”信号之后和发送初始化之前需要等待时间,即在发出“RTS请求发送”信号之后经过“RTS接通延时”设定的时间后才开始检测“CTS允许发送”信号,以此给予接收端足够的准备时间。

978-7-111-34922-8-Chapter08-48.jpg

图8-39 发送参数设置

“RTS关断延时”参数仅在“端口组态”中选择硬流控时有效,表示在完成传送后和撤销“RTS请求发送”信号之前需要等待时间,即在数据发送完后延时RTS OFF delay设定的时间后才撤销“RTS请求发送”信号,以此给予接收端足够的时间来接收消息帧的全部最新字符。

勾选“在消息开始时发送换行”选项,其后的“中断期间的位时间数”表示在延时“RTS接通延时”设定的时间并检测“CTS允许发送”信号后,在消息帧的开始位置发送BREAK(逻辑0、高电平)持续时间为多少个位时间,上限时间为8 s。

勾选“中断后发送线路空闲信号”选项,其后的“中断后线路空闲”表示在BREAK之后再发送多少个位时间的IDLE(逻辑1、低电平)信号,上限时间为8 s。此设置仅在勾选“在消息开始时发送换行”项后才有效。

除了通过界面来设置RS232/RS485端口的发送参数之外,也可以通过SEND_CFG指令块来设置,如图8-40所示,其参数含义如表8-6所示。需要注意的是,通过SEND_CFG设置的参数会覆盖图8-39所示的发送参数设置,但该设置在掉电后不保持。

978-7-111-34922-8-Chapter08-49.jpg

图8-40 SEND_CFG指令块

表8-6 SEND_CFG参数含义

978-7-111-34922-8-Chapter08-50.jpg

3.串口通信模块的接收参数设置

在串口通信模块接收数据之前,必须对模块的接收参数进行设置。在设备视图的通信模块属性对话框中选择“接收消息组态”项,可以设置接收参数。图8-41所示为消息帧起始条件设置,图8-44为消息帧结束条件设置。

图8-41中,消息帧的起始条件可设置为“以任意字符开始”或“以特殊条件开始”。“以任意字符开始”表示任何字符都可作为消息帧的起始字符;“以特殊条件开始”表示以特定字符作为消息帧的起始字符,具体设置有以下4种,可任选其中的一种或几种的组合(条件3或4只能选一),选择组合条件时按列表先后次序来判断是否符合消息帧起始条件。

1)通过换行识别消息开始:当接收端的数据线检测到逻辑0信号(高电平)并持续超过一个完整字符的传输时间(包括起始位、数据位、校验位和停止位),并以此作为消息帧的开始。

2)通过空行识别消息开始:在此设置接收端的数据线空闲(逻辑1信号、低电平)的位时间,并以此作为消息帧的开始时间,如图8-42所示。默认设置为40个位时间,最大值为65535,但不能超过8 s。

3)通过单个字符识别消息开始:以单个特定字符作为消息帧的开始,在此设置消息开始字符。默认设置为0x02,即STX。

978-7-111-34922-8-Chapter08-51.jpg

图8-41 消息帧起始条件设置

978-7-111-34922-8-Chapter08-52.jpg

图8-42 用空闲时间检测来启动接收指令

4)通过字符序列识别消息开始:以某个字符序列作为消息帧的开始,在此设定字符序列的数量。默认设置为1,最多可设置4个字符序列。每个字符序列均可选择启用或不启用,满足其中任何一个启用的字符序列均作为一个消息帧的开始。每个字符序列最多可包含5个字符。每个字符均可被选择是否检测该字符。如果不选择表示任意字符均可,如果选择该项则输入该字符对应的ASCII码值。

下面举例说明通过字符序列识别消息开始的设置。设定字符序列的个数为2,如图8-43所示,消息开始序列1和2中的“检查该字符”后的选择框均可选择,而字符序列3和4均不可选。按图8-43所示进行配置后,满足如下任一条件即可认为消息帧开始。

978-7-111-34922-8-Chapter08-53.jpg

图8-43 以某个字符序列作为消息帧的开始

1)当接收到的5个字符组成的字符序列的第一个字符为0x6A并且第5个字符为0x1C,而不论第2、3、4个字符是何字符,在检测完第5个字符后确认帧的开始,随即开始检测消息帧的结束条件。

2)当检测到第2个和第3个字符均为0X6A,而不论第1个字符是何字符,在检测完第3个字符后确认帧的开始,随即开始检测消息帧的结束条件。

例如,以下的字符满足图8-43所示的帧开始条件:

<任意字符>6A 6A

6A 1412131C

6A 120A 5E 1C

消息帧结束条件可设置为图8-44所示的6个条件中的一个或几个,只要满足选中的一个条件,即判断消息帧结束。这6个条件的具体含义如下:

1)通过消息超时识别消息结束:通过检测消息时间超过设定时间来判断消息帧结束。消息时间从检测到消息帧起始字符后开始计时,计时时间达到设定值后判断帧结束,如图8-45所示。默认设置为200 ms,范围为0~65535 ms。

978-7-111-34922-8-Chapter08-54.jpg

图8-44 消息帧结束条件设置

978-7-111-34922-8-Chapter08-55.jpg

图8-45 使用消息定时器来检测消息帧结束

2)通过响应超时识别消息结束:通过检测响应时间超过设定时间来判断消息帧结束。响应时间从传输结束开始计时,计时时间在接收到有效的信息帧的起始字符序列前达到设定值时判断帧结束。默认设置为200 ms,范围为0~65535 ms。

3)通过字符间超时识别消息结束:通过检测接收到相邻字符间的时间间隔,超过设定时间来判断消息帧结束。默认设置为12个位信号的时间长度,范围为0~65535个信号长度,最大不超过8 s。

4)通过最大长度识别消息结束:通过检测消息长度达到设定的字节数来判断消息帧结束。默认设置为0 B,最大值为1024 B。

5)从消息读取消息长度:消息内容本身包含消息的长度,通过从消息帧中获取的消息长度来判断消息帧结束。图8-44中,“消息中长度域的偏移量(n)”指存取消息长度值的字符的位置;“长度域大小”指消息长度字符的长度(为1、2和4);“长度域后面的数据未计入消息长度(m)”指在消息长度字符后面不计入消息长度的字符数。

例如,针对图8-46a的消息帧结构,应该设置如下:

n=2(即存放消息长度值的字符的位置为消息帧第2 B)。

长度域大小=1(用1 B来指示消息长度)。

m=0(在消息长度字符后没有不计入消息长度的字符)。

而针对如图8-46b所示的信息帧结构,应设置如下:

n=3(即存放消息长度值的字符的位置为消息帧第3字节)。

长度域大小=1(用1字节来指示消息长度)。

m=3(在消息长度字符后有3个不计入消息长度的字符,本例中字符SD2、FCS和ED未计入信息长度,而第5~10个字符计入消息长度)。

978-7-111-34922-8-Chapter08-56.jpg

图8-46 消息帧结构举例

6)通过字符序列识别消息结束:以一个字符序列作为消息帧的结束。每个字符序列最多可包含5个字符。每个字符均可被选择是否检测该字符,如果不选择该项表示任意字符均可,如果选择该项则输入该字符对应的ASCII码值。在这个字符序列中第一个被选择的字符前面的字符不作为消息帧结束的检测条件。在最后一个被勾选的字符后面的字符仍作为消息帧结束的检测条件。例如图8-44中的设置,如果检测到两个连续的0x7A,并接着两个字符,则判断消息帧结束,在0x7A 0x7A前的字符不计入字符序列,在0x7A 0x7A后的两个字符计入字符序列,而不论其是什么字符,且一定要收到两个字符。

除了通过界面来设置RS232/RS485端口的发送参数之外,也可以通过RCV_CFG指令块来设置,如图8-47所示,其参数含义如表8-7所示。需要注意的是,通过RCV_CFG设置的参数会覆盖图8-41所示的发送参数设置,但该设置在掉电后不保持。

978-7-111-34922-8-Chapter08-57.jpg

图8-47 RCV_CFG指令块

表8-7 RCV_CFG参数含义

978-7-111-34922-8-Chapter08-58.jpg

4.串口通信模块自由口通信协议举例

在完成通信端口设置、发送参数设置及接收参数设置后,需要在CPU中调用通信功能块发送和接收数据。下面以CM1241 RS232C与Windows操作系统的集成软件“超级终端”的通信为例介绍S7-1200串口通信模块使用自由口协议的数据发送和接收。

通过标准的RS232串口电缆连接计算机和CM1241。RS232端口的通信端口设置、发送参数设置及接收参数设置均可使用默认设置。

具体的组态步骤如下:

1)通过菜单命令“开始”→“所有程序”→“附件”→“通信”→“超级终端”打开“超级终端”软件。首先给连接分配一个名称“CM1241_RS232_TO_PC”,确定后选择连接接口COM3,再设置COM3参数与CM1241 RS232模块一致,此处使用默认设置如图8-48所示。

978-7-111-34922-8-Chapter08-59.jpg

图8-48 COM3属性设置与RS232一致

2)组态ASCII码参数。在超级终端中,通过菜单命令“文件”→“属性”打开属性对话框,单击“设置”选项卡的“ASCII码设置”按钮,打开“ASCII码设置”对话框,如图8-49所示,勾选“本地回显键入的字符”选项。

978-7-111-34922-8-Chapter08-60.jpg

图8-49 ASCII码设置

3)在S7-1200中发送程序。S7-1200的主程序OB1中调用SEND_PTP指令块,如图8-50所示,其含义见注释。

978-7-111-34922-8-Chapter08-61.jpg

图8-50 调用SEND_PTP指令块

下载项目并运行,当M20.0由0变为1时发送数据块db_Send(DB24)内db_Send.send_buffer数组中10 B的数据“How are you?”,可以看到超级终端中已接收到来自串口通信模块CM1421 RS232的字符。

4)在S7-1200中接收程序。在S7-1200的主程序OB1中调用RCV_PTP指令块,如图8-51所示,其含义见注释。

978-7-111-34922-8-Chapter08-62.jpg

图8-51 调用RCV_PTP指令块

下载项目并运行,当M28.0为1时检测RS232模块接收的信息,并将成功接收到的数据存放到db_RCV(DB2)的db_RCV.RCV_buffer数组中的15字节数组内。通过超级终端的菜单命令“传送”→“发送文本文件”给RS232模块发送一个文本文件。发送时可观察到RS232模块上的接收指示灯Rx会闪烁,可以在监视表格中查看数据块db_RCV中的内容。