我们的一个客户可以在使用SD300伺服驱动过程中向我们反馈了这样一个问题,客户通过485发送一串报文,让电机在速度模式下运行一定的速度,但是出现了发送报文以后,驱动器没有响应的现象,客户确定自己发送的报文是正确的,然后连着发送几次以后,驱动器才正常响应,电机跑了起来。以下为客户发送的报文原文:
客户接线图: 首先,客户反映485通讯发送报文,驱动有响应,可以判断驱动器的485通讯应该是不存在问题的 ,响应时间有延迟,需要客户发送多次才有反映,说明接收报文不顺畅,初步判断或者存在干扰的可能。 485通讯接口采用差分方式传输信号,,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但由于收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。即共模干扰的问题,所以485通讯一般使用可以起到屏蔽作用的双绞线,来降低干扰。 图中客户使用的线并不是标准双绞线,存在有干扰收发信号的因素在,可以建议客户更换双绞线来减低干扰。 另外就是判断客户发送报文信息格式是否存在问题,格式不对也会影响发送信息准确性。 通讯参数 使用 RS-485 通讯时,上位控制器为主机,伺服驱动器为从机。伺服驱动器的通讯地址需由此参数设定为不同的通讯站号,站号地址的设定范围为-1~247,默认值为-1 表示关闭通讯功能,设置值大于 0 表示开放通讯功能。在使用通讯功能之前,必须将此参数设置为需要的站号,此站号代表本驱动器在通讯网络中的****地址,一组伺服驱动器仅能设定一站号,若重复设定站号将导致无法正常通讯。 通过此参数选择 RS-485 通讯的波特率,不同的值对应不同的波特率,选择的通讯波特率需与上位控制器的通讯波特率一致,具体的设定值如下: 参数意义: 0:波特率为 4800bps 1:波特率为 9600bps 2:波特率为 19200bps 3:波特率为 38400bps
通过此参数选择 RS-485 通讯的数据模式,选择的数据模式需与上位控制器的通讯协议一致,具体的参数值意义如下: 0:数据位-8 位 校验位-无 停止位-1 位 1:数据位-8 位 校验位-偶校验(Even) 停止位-1 位 2:数据位-8 位 校验位-奇校验(Odd) 停止位-1 位 3:数据位-8 位 校验位-无 停止位-2 位 4:数据位-8 位 校验位-偶校验(Even) 停止位-2 位 5:数据位-8 位 校验位-奇校验(Odd) 停止位-2 位 使用 RS-485 串行通讯时,每台伺服驱动器必须预先在参数 Pr181 上设定其通讯站号,计算机或者上位控制器根据站号对相应的伺服驱动器实施控制;波特率需要参考上位控制器的通讯方式来设定参数 Pr182;MODBUS 通讯协议暂时只支持 RTU(Remote Terminal Unit)模式,使用者可根据上位控制器的要求在参数Pr183 上设定所需的通讯数据模式。以上参数设置完成后,需要执行参数保存操作并且断电重启驱动器后才能生效。 RTU 模式: MODBUS 应用层协议定义了一个简单的协议数据单元(PDU),如下图所示,该协议数据单元不依赖于底层的通讯层。
MODBUS 以地址场作为帧的开始,地址场的内容为有效地址值(0~247),主机在请求信息的地址场中放置从机地址值以确定该请求信息的接收者,符合 条件的从机接收到信息并完成相应处理之后,在响应信息的地址场中放置自身 的地址值,使主机知道是何从机发送的响应。地址场之后是功能码,它指示从机将完成何种操作。功能码之后是数据场, 数据场包含请求和响应的参数,根据功能码的不同,数据场的格式、长度以及含义也有所不同。校验码是用来验证信息的有效性,保证信息传送的可靠性。RTU 模式下是使用的 16 位 CRC(Cyclical Redundancy Check)校验。 RTU 模式下,信息帧中的每 8 位一个字节的数据按 2 个 4 位的 16 进制码发送,例如:1byte 数据 64H。 (以下为天书,有兴趣的可以自行了解一下哈) RTU 模式是面向比特的传输模式,以不少于 3.5 个字符的空闲时间为帧的开始,随后发送的是地址场,网上设备监视通讯总线,当连续监视到 3.5 个字符的空闲时间后可以接收地址场信息,当判断接收到的地址场信息为有效时,继续接收其后信息,然后根据功能码及附加信息进行相应操作,若要求有响应信息则封装响应信息并发送给主机。最后发送的字节大约经过 3.5 个字符的空闲时间后表示信息帧的结束,新的信息帧可以发送。RTU 模式靠模拟的同步信息来保持帧同步,整个信息帧必须作为连续数据流一次传送完。如果一个连续数据流在传送过程中,接收设备检测到有 1.5 个以上字符间隔时间,则认为一帧数据已经接收完,并把下一个接收字符作为下一帧的开始。 在正常情况下,信息帧之间的间隔时间至少有 3.5 个字符,即一帧数据发送完,至少要经过 3.5 个字符的空闲时间才能发送下一帧数据。
字符结构:
由客户发送的报文可以判断出格式是没有问题的 。但是客户需要以速度模式发送 那么发送的信息即为速度信息:
客户自己判断出写的代码里面,虽然发送的指令是对的,但是线程间的切换导致指令发送分段发送,导致驱动器接收的报文不完整。所以不响应了。其实还是指令设置的问题。
|