使用自定义协议控制外部设备

从机器视觉大师6.3版开始,可以使用自定义协议与外部设备进行通信,实现读取外部仪器数据,控制PLC输出等任务。自定义协议为ASCII文本模式,使用串口(RS232, 485, 422均可)通信。

  

自定义协议基本语法

在工控行业中,大部分串口模块在通信的时候,一般都是发送一条指令,然后读取响应。指令语法中都包含读取或设置功能地址(也叫控制点,线圈之类)或具体数据(这些数据可能是电流值或电平值),其它部分基本在通信过程中不变。

 

根据这个现象和规则,引入两个转义字符,以原始的指令为基础,创建一条新的指令格式,通过中间层解释执行,达到实现任意自定义协议模块通信的目的。

 

1. 地址转义字符@

如果指令需要指定地址,通过字符@进行转义。其语法如下:

     @[1..F]   

以字符@开头,后面接一个16进制的字符,表示该地址的长度,最大长度为15

@3,当前地址设置为5, 那么转义后的指令为005

 

假设原来的一个外部设备的读取指令为TC0010#, 该指令读取终端设备第一路的输入状态(有输入或无输入), 001表示地址,最大长度为3,那么新的指令将为TC@30#

 

如果@只是一个普通的字符,不是转义字符,那么需要在其前面加一个@, @@

 

2. 数据转义字符$

如果指令需要获取其中的数据,或写入数据,通过字符$进行转义。其语法如下:

     $[1..F]

以字符$开头,后面接一个16进制的字符,表示该数据的长度,最大长度为15

$1,当前的数据长度为1; $b,表示当前数据长度为11

 

假设上节所述读取指令TC0010#, 其实际的响应指令为TD10# , 1表示地址,地址长度为10表示数据,表示为无输入(低电平),数据长度为1。新的指令将为TD@1$1#

 

如果$只是一个普通的字符,不是转义字符,那么需要在其前面加一个$, $$

 

请求指令(发送)和响应指令的地址长度和数据长度都不一定相同,如果一个指令中不需要地址或数据,就直接使用原来的指令格式即可。如

       awo0关闭一个模块的输出状态。

 

该指令不需要输入地址和获取数据,因此,只需要直接将awo0作为新指令即可。 (当然,在机器视觉大师里面,这条指令基本上没有什么用途的。)

 

3. 小数精度

数据类型为字或双字,浮点时,可以设置当前浮点数据的精度。转换后的数据将处理指定的数据精度。如,当前数据为1234,假设指定小数精度为2,则改数值表示为12.34

 

自定义协议的支持数值和地址均为10进制。本文所述的地址为一个外部模块内部的控制单元地址、线圈或输入输出点等 ,非模块本身的地址(如485,422中的设备地址)。

 

设置基本串口通信

点击”模式->设置菜单,出现选项窗口, 切换到输入输出页,将外部设备设置为”自定义协议模块,如下图:

 

 

选择当前系统里面分配给外部模块的端口号,笔者的本机分配的端口号为”COM3”。

 

 

 

点击右边”...”按钮,弹出串口通信参数窗口,设置合适的参数,如下图。

 

 

根据外部协议重新创建指令

1. 创建新读指令

某一个扩展8路输入输出模块的读指令定义如下:

TC0010#

001表示第1路,后面0表示数据,在该指令中无实际意义。该指令实现读取第1路当前输入信号的功能,返回0表示无输入,返回1表示有输入。

 

如果通行正常,第一路无输入,模块将返回

    TD10#

如果有输入,模块将返回

    TD11#

也即TD后面的1表示第1路,紧接着的0(或1)表示返回的数据。

 

在”选项”窗口的”输入输出”页,点击”相机或startup触发”的”自定义”按钮,弹出”自动义串口协议”,如下图:

 

根据原指令的格式,请求地址长度为3,返回地址长度为1,返回的数据长度为1。因此在请求框里面输入”TC@30#”, 响应框里面输入”TD@1$1#”,由于都是数据为整数,设置小数精度为0, 该模块无需结束字符,结束符设置为无。地址范围从1到4。

 

2. 创建新的写指令

下面是8路输入输出模块的写指令定义:

TA0010#

001表示第1路,后面0表示数据,表示无输出;如果为1表示有输出。

 

如果通行正常,模块将返回TB10#(无输出)或TB11#(有输出)

  

在”选项”窗口的”输入输出”页,点击”结果输出”栏的”自定义”按钮,弹出”自动义串口协议”,如下图:

 

根据原指令的格式,请求指令的地址长度为3,返回地址长度为1,返回的数据长度为1。因此在请求框里面输入”TA@3$1#”, 响应框里面输入”TB@1$1#”。由于数据为整数,设置小数精度为0, 该模块无需结束字符,结束符设置为无。地址范围从1到4。

 

在脚本语言中使用

假设读者已经熟悉如何在机器视觉大师的”编辑脚本”窗口进行编程,如果不太熟悉,请重新阅读C13等章节。限于篇幅,此处不再赘述。

 

在”编辑脚本”窗口里面,为”检测完成后”事件输入以下脚本:

 

ret, data = cscm.read(1, 3)

从上节生成的读指令编号为1,故第1个参数为1,第2个表示第3路。

 

if ret then

   trace(data)

else

   trace("error occurred")

end

如果通信成功,使用trace命令输出数据到调试窗口, 否则输出错误信息。

 

下面是对写指令测试的脚本:

ret  = cscm.write(2,2, 1)

从上节生成的写指令编号为2,故第1个参数为2,第2个表示第2路,第3个参数表示有输出(1)。

 

if ret then

   trace("writen successfully!")

else

   trace("error occurred")

end

 

使用trace命令输出通信状态到调试窗口。


最新版多多摄像头大师(机器视觉大师)下载地址:http://www.hdy.net.cn/softshare/ddcam.htm

技术交流QQ群: 295860595  该群文件空间即时更新多多摄像头大师最新版本,下载速度更快


### 回答1: STM32是一种常用的微控制器,它可以通过串口与其他设备进行通信。而自定义协议解析则是指在串口通信过程中,通过编写代码解析特定格式的数据帧。 首先,我们需要定义自己的协议格式。协议中包含了数据帧的起始符、帧长度、数据内容和校验位等信息。例如,我们可以使用起始符“$”表示数据帧的开始。接下来,根据协议定义的长度字段(可以是固定长度或可变长度),读取数据帧的长度。然后根据长度字段读取数据内容,并进行相应的处理,例如将数据存储到缓冲区中。在读取数据的过程中,还需要对数据的完整性进行校验,例如使用CRC校验算法。校验通过后,我们可以根据业务需求对数据进行进一步处理,例如将数据发送给其他模块进行处理,或者通过串口回传应答数据等。 在STM32上实现自定义协议解析的关键在于串口中断的使用。通过配置串口接收中断,我们可以在每次接收到一个字节的数据时触发中断服务函数。在中断服务函数中,我们需要根据协议解析的逻辑对接收到的数据进行处理,判断数据帧的起始和结束位置。根据不同的业务需求,我们还可以根据协议解析的结果触发其他的操作,例如更新LCD显示、控制外部设备等。 另外,为了提高解析效率和稳定性,我们还可以通过使用DMA(直接内存访问)模式进行串口接收。DMA可以在不需要CPU的干预下直接将接收到的数据存储到指定的缓冲区中,从而避免了中断服务函数的频繁调用,提高了系统的响应速度和并发处理能力。 总而言之,STM32串口自定义协议解析是指通过编写代码,按照自定义协议格式解析串口数据帧,并根据解析结果进行相应的处理。这样可以实现与其他设备的可靠通信,并且可以根据业务需求灵活地进行数据的处理。 ### 回答2: STM32是一款广泛应用于嵌入式系统中的微控制器芯片,它具有丰富的外设资源,其中包括串口(USART)模块。在进行串口通信时,我们可以使用自定义协议来实现数据的传输和解析。 串口自定义协议解析的过程主要分为两个步骤:发送端的数据封装和接收端的数据解析。 在发送端,我们需要将要传输的数据按照自定义协议格式进行封装。通常情况下,自定义协议包含数据头、数据内容和校验位等信息。数据头用于标识数据的起始位置,数据内容包含要传输的实际数据,而校验位则用于验证数据的完整性。在STM32中,我们可以使用串口发送函数来将封装好的数据发送出去。 在接收端,首先需要配置串口接收中断功能,以实现数据的异步接收。当接收到数据后,中断服务程序会自动被触发。在中断服务程序中,我们可以通过读取串口接收寄存器的方式获取接收到的数据。接收到的数据需要按照自定义协议进行解析,校验数据头,确认数据的起始位置。接着,我们可以提取出数据内容,并进行相应的处理。最后,我们还需要验证校验位,以确保接收到的数据的完整性。 在STM32中,除了基本的串口发送和接收函数外,还可以使用串口DMA功能来提高数据的传输效率,减少CPU的占用率。通过配置DMA通道和缓冲区,我们可以实现串口数据的自动发送和接收,而无需频繁地进行CPU的中断处理。 总而言之,STM32串口自定义协议解析需要在发送端进行数据封装,在接收端进行数据解析,通过中断或DMA机制实现数据的异步传输。这种方式可以使数据的传输更加稳定和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值