点击上方“正运动小助手”,随时关注新动态!
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_1672814123224465414
正运动技术运动控制器自定义通讯
上一节讲了运动控制器MODBUS通讯,今天我们来学习一下,运动控制器的自定义通讯。
控制器的串口和网口默认使用MODBUS协议通讯,若对端设备不支持MODBUS协议,可开启自定义通讯模式(无协议)通讯。
串口和网口均可开启自定义通讯。
串口和网口自定义通讯的开启方法不同,均使用指令开启自定义通讯,读写通道数据所用的读写指令是相同的。
串口使用SETCOM指令开启自定义通讯,网口使用OPEN #开启自定义通讯,选择正确的PORT通道开启通讯。
串口和网口自定义通讯读写指令:读取指令:GET #;发送指令:PRINT #和PUTCHAR #。
本文测试举例的产品是正运动技术的一款快速开发16轴的运动控制系统的ZMC316独立型脉冲运动控制器。
在正式学习之前,我们先来介绍ZMC316控制器。其支持多达24轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。
ZMC316通过ZDevelop开发环境来调试,ZDevelop是一个很方便的编程、编译和调试环境。应用程序还可以使用VC,VB, VS, C++Builder, C#,等软件来开发。调试时可以ZDevelop软件同时连接到控制器,程序运行时需要动态库zmotion. dll。
ZMC316具有16个轴,可支持多达24个虚拟轴。ZMC316可以通过扩展模块来扩展轴。
ZMC316板上自带24+15个通用输入口,8+15个通用输出口(前15轴另带1个输入口,2个输出口),2个0-10V AD, 2个0-l0V DA。
ZMC316带1个RS232串口,1个RS485,1个RS422,1个以太网接口。
ZMC316带一个CAN总线接口,支持通过ZCAN协议来连接扩展模块。
ZMC316带一个U盘接口。
每轴输出脉冲频率可达8MHz。
ZMC316接线图
以下是本文的主要内容。
壹串口自定义通讯(无协议)
1.开启方法
开启自定义串口通讯需要选择port编号,默认RS232为port0,RS485为port1,使用指令将port配置为自定义串口通讯模式。
SETCOM指令除了可以配置串口的通讯基本参数外,还可以选择参数配置通讯协议,开启自串口定义通讯模式将mode=0无协议模式,填写串口基本参数和开启的port编号。
语法:SETCOM (baudrate,databits,stopbits,parity,port[,mode] [,variable] [,timeout])
mode值
|
描述
|
0
|
RAW数据模式,无协议,此时可以使用GET #,PRITNT #
|
4(缺省)
|
MODBUS从端(16位整数)
|
14
|
MODBUS主端(16位整数)
|
15
|
直接命令执行模式,此时可以直接从串口输入字符串命令(换行符结束)
|
开启示例:
RS232(PORT0):SETCOM (38400,8,1,0,0,0,2,1000)
RS485(PORT1):SETCOM (38400,8,1,0,1,0,2,1000)
2.读写方法
网口或串口自定义通讯采用的指令相同。
自定义通道中读取字符:GET #
自定义通道中发送字符:PRINT #、PUTCHAR #
两个指令一次只能发送一个数据,若要发送多个数据,可采用数组。PRINT #与PUTCHAR #的区别是前者发送的数据为字符串,一次只能发送一个数据,发送的数组为ASCII码;后者均为ASCII码。
(1)GET #
语法1:GET #PORT, VARIABLE
语法2:GET #PORT, ARRAY[(startindex)] [,maxchares]
语法3:charesget = GET #PORT, VARIABLE
语法4:charesget = GET #PORT, ARRAY[(startindex)] [,maxchares]
port:通道号
variable:存放的变量名
startindex:存放数组的起始地址
maxchares:存放的最多数量
语法1、2没有读取到会阻塞,这个函数一般在多任务里面进行调用。
语法3、4会返回读取到的字节数。
串口和网口的TCP通讯四种语法均可使用,网口的UDP通讯时使用语法4, 采用数组来接收,数组长度不要比一次的UDP包长度小。
例一:读取字符
GET # 11,tempchar '从自定义网口通道11获取单个字符到tempchar
读取结果:
发送数据
|
1
|
123
|
1,2
|
发送字符数
|
1
|
3
|
3
|
GET #获取的值
|
49
|
49 50 51
|
49 44 50
|
例二:读取到数组
GET #11,array(0),5 '一次获取最多5字符到数组,后收到的数据覆盖之前的数据
读取结果:
发送数据
|
1
|
123
|
12345678
|
发送字符数
|
1
|
3
|
8
|
GET #获取的值
|
49
|
array(0)=49
array(1)=50
array(2)=51
|
array(0)=54
array(1)=55
array(2)=56
array(3)=52
array(4)=53
|
例三:读取到数组(UDP模式下只能使用此语法)
CHARES=GET #11, Data, 10 '从通道11获取数据到数组,读取数据长度设为10
读取结果:
发送数据
|
1
|
123
|
12345
|
发送字符数
|
1
|
3
|
5
|
GET #获取的值
|
Data=1
Data(0)=49
|
Data=123
Data(0)=49
Data(1)=50
Data(2)=51
|
Data=12345
Data(0)=49
Data(1)=50
Data(2)=51
Data(3)=52
Data(4)=53
|
(2)PRINT #
PRINT # PORT, "字符串"
port:通道号
例一:发送字符串
PRINT # 11, tempchar '一次发送一个字符串
PRINT #发送数据
|
"字符串"
|
123
|
"abcd"
|
发送字符串数
|
1
|
1
|
1
|
对端获取的值
|
字符串
|
123
|
abcd
|
例二:发送数组为ASCII码
PRINT # 11, Data '一次发送一个字符串
PRINT #发送数组
|
Data(0,48,49,50,51,52,53)
|
Data(0,48,49,50,0,51,52,53)
|
发送特点
|
第一个为数组索引,后面6个数据为数组元素
|
数组中遇到0停止发送
|
对端获取的值
|
012345
|
012
|
(3)PUTCHAR #
语法1:PUTCHAR # PORT, 字符
语法2:PUTCHAR # PORT, ARRAY(index, numes)
port:通道号
index:开始输出的位置
numes:输出的字节个数, 二进制方式
例一:发送字符为ASCII码,不能直接发送字符串
PUTCHAR # 11, tempchar '一次可发送多个字符,逗号隔开
PUTCHAR #发送数据
|
49,50,51
|
123
|
70,71
|
发送字符数
|
3
|
1
|
2
|
对端获取的值
|
123
|
{
|
FG
|
例二:发送数组为ASCII码
PUTCHAR # 11, Data '一次发送一个字符串
PUTCHAR #发送数组
|
Data(0,48,49,50,51,52,53)
|
Data(0,48,49,50,0,51,52,53)
|
发送特点
|
第一个为数组索引,后面6个数据为数组元素
|
数组中遇到0停止发送
|
对端获取的值
|
012345
|
012
|
3.通讯例程
控制器通过485总线开启自定义通讯读取三菱绝对值编码器数据。
'//*****返回数据帧中有用的字符串长度为8****globalDim CmdBuff(10) '发送命令数组globalDim GetBuff(30) '接收的字符串
fori=0 to 29GetBuff(i)=0nextglobalDim TempChar '接收的一个字节TempChar=0globalDim GetNum '接收字节个数GetNum=0
globalsanReturn '任务完成后的返回值,方便PC读取sanReturn=0
SetCom(19200,8,1,2,1,0)'建立485连接
'必须创建新任务,因为Get指令如果得不到数据,会堵塞所在任务。RunTask5,get_Chardelay(100)
'命令数组的值根据从站三菱的自定义通讯的协议要求写的'\x01\x31\x30\x32\x02\x39\x31\x03\x30\x32'目前的从站地址为1,修改从站地址后要修改校验码
CmdBuff(0,$01,$31,$30,$32,$02,$39,$31,$03,$30,$32)PutChar#1,CmdBuff '往485串口发送数据TICKS=1000while(1)ifGetNum=14 AND (GetBuff(2)=97 OR GetBuff(2)=65) then?"485 success"'把返回数据帧的有用内容放入VR寄存器中,方便PC读取fori = 0 to 7VR(100+i) = GetBuff(i+3) nextsanReturn=1exitwhileelseifTICKS<0 then?"ERROR" STOPTASK5exitwhile endifwendend
globalSub Get_Char()print"开始进入接收函数"While 1Get#1,TempChar '接收串口返回字符print"接收到的字符数",GetNumTempCharGetBuff(GetNum)=TempCharGetNum=GetNum+1'判断返回的数据桢长度是否正确if(GetNum=14)Thenexitwhile '长度超出退出while循环 endifWendEndSub
贰网口自定义通讯
1.开启方法
开启自定义通讯时要填入端口编号,首先要查看控制器自定义通讯的通道号,可在在线命令发送?*port打印查看,如下图,ECUSTOM为自定义网口通道。
使用网口连接上控制器之后打印的各通道状态如下,未使用的通道状态为0,已使用的通道状态为1对于串口,串口通道状态不管有没有使用始终为1。第三个通道为ETH网口通道,被ZDevelop软件占用。
开启网口自定义通讯,选择port11,此时状态如下:
网口自定义通讯使用OPEN #指令开启,通过此指令选择主从端。
OPEN #PORT, "mode", portnum [, ipaddress]
port:通讯通道,参见PORT描述,选择自定义网络通道。
mode:讯主从,“TCP_CLIENT”-从,“TCP_SERVER”–主,“UDP_CLIENT”-UDP从,“UDP_SERVER”–UDP主。
portnum:TCP或UDP端口号, 主端为本地端口号, 从端为对方端口号。
ipaddress:对方IP地址,字符串,从端的时候要提供。
UDP_SERVER必须先接收对方的数据,才能发送回数据(除非用PORT_TARGET先强制指定对方)。
UDP_CLIENT本地端口号随机,必须先发送给对方,对方才能知道端口号,此模式时不是指定对方的包会丢弃掉。
UDP自定义通讯需要4系列控制器20170628以上固件版本;XPLC系列控制器 20170702以上固件版本。
TCP在收发数据前,必须和对方建立可靠的连接,然后再传输数据,大大提高了数据通信的可靠性。
UDP在收发数据前,不建立连接,当它想传送时就去抓取来自应用程序的数据,并尽可能快地把它扔到网络上,可能会丢包。UDP程序结构较简单,信息包比较小只有8个字节,TCP的信息包有20个字节。
2.读写方法
读写指令与串口相同。UDP读取时只能使用GET #语法4。
3.TCP通讯例程
使用自定义网口通道port11,程序如下。
OPEN#11, "TCP_SERVER",945 '使用自定义网口通道2,控制器作为主端,端口号945GLOBALtempcharGLOBALCONST datamax=20 '定义数组空间的大小GLOBALData(datamax) '定义数组GLOBALdatanum '定义数组编号datanum=0
ClearData()'清空数组
WHILE1tempchar = 0 '清除之前的字符GET#11,tempchar '获取单个字符到tempcharPRINTdatanum,tempchar '打印出字符的ASCII码Data(datanum) = tempchar '保存到数组datanum = datanum + 1
IFdatanum = datamax THEN '超过数组空间,清空数组datanum = 0ClearData()ENDIFIFtempchar = 59 THEN '号终止位;PRINT#11,"ok" '发送字符串ENDIFWENDEND
GLOBALSUB ClearData()FORi = 0 TO datamax-1 '清除数组空间内容Data(i) = 0NEXTENDSUB
运行效果:
4.UDP通讯例程
使用自定义网口通道port11,程序如下。
OPEN#11, "UDP_SERVER",945 '使用自定义网口通道2,控制器作为主端,端口号945GLOBALCHARESGLOBALCONST datamax=10 '定义数组空间的大小GLOBALData(datamax) '定义数组
ClearData()'清空数组
WHILE1 CHARES=GET #11, Data, 10 '从通道11获取数据到数组,数据长度设为10IFCHARES > 0 THENData(CHARES) = 0 '设置结束0PRINTData '打印字符串ENDIFWENDEND
GLOBALSUB ClearData()FORi = 0 TO datamax-1 '清除数组空间内容Data(i) = 0NEXTENDSUB运行效果:
正运动技术运动控制器的自定义通讯就讲到这里,更多学习视频及图文详解请关注我们的公众号“正运动小助手”。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
回顾往期内容
快速入门|篇二十:正运动技术运动控制器MODBUS通讯快速入门|篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介快速入门|篇十八:正运动技术脉冲型运动控制器的使用快速入门|篇十七:运动控制器多轴插补运动指令的使用
快速入门|篇十六:正运动控制器EtherCAT总线快速入门
快速入门|篇十五:运动控制器运动缓冲简介
快速入门|篇十四:运动控制器基础轴参数与基础运动控制指令
快速入门|篇十三:正运动技术运动控制器ZDevelop 编程软件的使用
快速入门|篇十二:正运动技术运动控制器U盘接口的使用快速入门|篇十一:正运动技术运动控制器中断的应用
快速入门|篇十:运动控制器多任务运行特点快速入门|篇九:如何进行运动控制器示波器的应用?快速入门|篇八:如何进行运动控制器EtherCAT总线的基础使用?
快速入门|篇七:如何进行运动控制器ZCAN总线扩展模块的使用?
快速入门|篇六:如何进行运动控制器数据与存储的应用?
快速入门|篇五:如何进行运动控制器输入/输出IO的应用?快速入门|篇四:如何进行运动控制器与触摸屏通讯?
快速入门|篇三:如何进行运动控制器ZPLC程序开发?
快速入门|篇二:如何进行运动控制器ZBasic程序开发?
快速入门|篇一:如何进行运动控制器固件升级?
关于正运动技术
正运动技术是一家专注于运动控制技术研发与应用的国家级高新技术企业,主要从事运动控制器、运动控制卡、视觉运动控制一体机以及IO扩展模块等产品的研发、生产、销售和服务。
公司汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校致力于运动控制技术研究与应用,是国内工控领域发展最快的企业之一,也是国内完整掌握运动控制核心技术和实时工控软件平台技术的企业。
|