時(shí)間:2020-12-31 09:58:20來源:正運(yùn)動技術(shù)
視頻教材:《正運(yùn)動技術(shù)運(yùn)動控制器自定義通訊》
上一節(jié)講了運(yùn)動控制器MODBUS通訊,今天我們來學(xué)習(xí)一下,運(yùn)動控制器的自定義通訊。
控制器的串口和網(wǎng)口默認(rèn)使用MODBUS協(xié)議通訊,若對端設(shè)備不支持MODBUS協(xié)議,可開啟自定義通訊模式(無協(xié)議)通訊。
串口和網(wǎng)口均可開啟自定義通訊。
串口和網(wǎng)口自定義通訊的開啟方法不同,均使用指令開啟自定義通訊,讀寫通道數(shù)據(jù)所用的讀寫指令是相同的。
串口使用SETCOM指令開啟自定義通訊,網(wǎng)口使用OPEN #開啟自定義通訊,選擇正確的PORT通道開啟通訊。
串口和網(wǎng)口自定義通訊讀寫指令:讀取指令:GET #;發(fā)送指令:PRINT #和PUTCHAR #。
本文測試舉例的產(chǎn)品是正運(yùn)動技術(shù)的一款快速開發(fā)16軸的運(yùn)動控制系統(tǒng)的ZMC316獨(dú)立型脈沖運(yùn)動控制器。
在正式學(xué)習(xí)之前,我們先來介紹ZMC316控制器。其支持多達(dá)24軸直線插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)的運(yùn)動控制。
ZMC316通過ZDevelop開發(fā)環(huán)境來調(diào)試,ZDevelop是一個(gè)很方便的編程、編譯和調(diào)試環(huán)境。應(yīng)用程序還可以使用VC,VB, VS, C++Builder, C#,等軟件來開發(fā)。調(diào)試時(shí)可以ZDevelop軟件同時(shí)連接到控制器,程序運(yùn)行時(shí)需要動態(tài)庫zmotion. dll。
ZMC316具有16個(gè)軸,可支持多達(dá)24個(gè)虛擬軸。ZMC316可以通過擴(kuò)展模塊來擴(kuò)展軸。
ZMC316板上自帶24+15個(gè)通用輸入口,8+15個(gè)通用輸出口(前15軸另帶1個(gè)輸入口,2個(gè)輸出口),2個(gè)0-10V AD, 2個(gè)0-l0V DA。
ZMC316帶1個(gè)RS232串口,1個(gè)RS485,1個(gè)RS422,1個(gè)以太網(wǎng)接口。
ZMC316帶一個(gè)CAN總線接口,支持通過ZCAN協(xié)議來連接擴(kuò)展模塊。
ZMC316帶一個(gè)U盤接口。
每軸輸出脈沖頻率可達(dá)8MHz。
ZMC316接線圖
以下是本文的主要內(nèi)容。
壹 串口自定義通訊(無協(xié)議)
1.開啟方法
開啟自定義串口通訊需要選擇port編號,默認(rèn)RS232為port0,RS485為port1,使用指令將port配置為自定義串口通訊模式。
SETCOM指令除了可以配置串口的通訊基本參數(shù)外,還可以選擇參數(shù)配置通訊協(xié)議,開啟自串口定義通訊模式將mode=0無協(xié)議模式,填寫串口基本參數(shù)和開啟的port編號。
語法:SETCOM (baudrate,databits,stopbits,parity,port[,mode] [,variable] [,timeout])
開啟示例:
RS232(PORT0):SETCOM (38400,8,1,0,0,0,2,1000)
RS485(PORT1):SETCOM (38400,8,1,0,1,0,2,1000)
2.讀寫方法
網(wǎng)口或串口自定義通訊采用的指令相同。
自定義通道中讀取字符:GET #
自定義通道中發(fā)送字符:PRINT #、PUTCHAR #
兩個(gè)指令一次只能發(fā)送一個(gè)數(shù)據(jù),若要發(fā)送多個(gè)數(shù)據(jù),可采用數(shù)組。PRINT #與PUTCHAR #的區(qū)別是前者發(fā)送的數(shù)據(jù)為字符串,一次只能發(fā)送一個(gè)數(shù)據(jù),發(fā)送的數(shù)組為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:存放數(shù)組的起始地址
maxchares:存放的最多數(shù)量
語法1、2沒有讀取到會阻塞,這個(gè)函數(shù)一般在多任務(wù)里面進(jìn)行調(diào)用。
語法3、4會返回讀取到的字節(jié)數(shù)。
串口和網(wǎng)口的TCP通訊四種語法均可使用,網(wǎng)口的UDP通訊時(shí)使用語法4, 采用數(shù)組來接收,數(shù)組長度不要比一次的UDP包長度小。
例一:讀取字符
GET # 11,tempchar '從自定義網(wǎng)口通道11獲取單個(gè)字符到tempchar
讀取結(jié)果:
例二:讀取到數(shù)組
GET #11,array(0),5 '一次獲取最多5字符到數(shù)組,后收到的數(shù)據(jù)覆蓋之前的數(shù)據(jù)
讀取結(jié)果:
例三:讀取到數(shù)組(UDP模式下只能使用此語法)
CHARES=GET #11, Data, 10 '從通道11獲取數(shù)據(jù)到數(shù)組,讀取數(shù)據(jù)長度設(shè)為10
讀取結(jié)果:
(2)PRINT #
PRINT # PORT, "字符串"
port:通道號
例一:發(fā)送字符串
PRINT # 11, tempchar '一次發(fā)送一個(gè)字符串
例二:發(fā)送數(shù)組為ASCII碼
PRINT # 11, Data '一次發(fā)送一個(gè)字符串
(3)PUTCHAR #
語法1:PUTCHAR # PORT, 字符
語法2:PUTCHAR # PORT, ARRAY(index, numes)
port:通道號
index:開始輸出的位置
numes:輸出的字節(jié)個(gè)數(shù), 二進(jìn)制方式
例一:發(fā)送字符為ASCII碼,不能直接發(fā)送字符串
PUTCHAR # 11, tempchar '一次可發(fā)送多個(gè)字符,逗號隔開
例二:發(fā)送數(shù)組為ASCII碼
PUTCHAR # 11, Data '一次發(fā)送一個(gè)字符串
3.通訊例程
控制器通過485總線開啟自定義通訊讀取三菱絕對值編碼器數(shù)據(jù)。
'//*****返回?cái)?shù)據(jù)幀中有用的字符串長度為8****
global Dim CmdBuff(10) '發(fā)送命令數(shù)組
global Dim GetBuff(30) '接收的字符串
for i=0 to 29
GetBuff(i)=0
next
global Dim TempChar '接收的一個(gè)字節(jié)
TempChar=0
global Dim GetNum '接收字節(jié)個(gè)數(shù)
GetNum=0
global sanReturn '任務(wù)完成后的返回值,方便PC讀取
sanReturn=0
SetCom(19200,8,1,2,1,0) '建立485連接
'必須創(chuàng)建新任務(wù),因?yàn)镚et指令如果得不到數(shù)據(jù),會堵塞所在任務(wù)。
RunTask 5,get_Char
delay (100)
'命令數(shù)組的值根據(jù)從站三菱的自定義通訊的協(xié)議要求寫的
'\x01\x31\x30\x32\x02\x39\x31\x03\x30\x32
'目前的從站地址為1,修改從站地址后要修改校驗(yàn)碼
CmdBuff(0,$01,$31,$30,$32,$02,$39,$31,$03,$30,$32)
PutChar #1,CmdBuff '往485串口發(fā)送數(shù)據(jù)
TICKS=1000
while(1)
if GetNum=14 AND (GetBuff(2)=97 OR GetBuff(2)=65) then
? "485 success"
'把返回?cái)?shù)據(jù)幀的有用內(nèi)容放入VR寄存器中,方便PC讀取
for i = 0 to 7
VR(100+i) = GetBuff(i+3)
next
sanReturn=1
exit while
elseif TICKS<0 then
? "ERROR"
STOPTASK 5
exit while
endif
wend
end
global Sub Get_Char()
print"開始進(jìn)入接收函數(shù)"
While 1
Get #1,TempChar '接收串口返回字符
print"接收到的字符數(shù)",GetNum TempChar
GetBuff(GetNum)=TempChar
GetNum=GetNum+1
'判斷返回的數(shù)據(jù)楨長度是否正確
if(GetNum=14)Then
exit while '長度超出退出while循環(huán)
endif
Wend
End Sub
貳 網(wǎng)口自定義通訊
1.開啟方法
開啟自定義通訊時(shí)要填入端口編號,首先要查看控制器自定義通訊的通道號,可在在線命令發(fā)送?*port打印查看,如下圖,ECUSTOM為自定義網(wǎng)口通道。
使用網(wǎng)口連接上控制器之后打印的各通道狀態(tài)如下,未使用的通道狀態(tài)為0,已使用的通道狀態(tài)為1對于串口,串口通道狀態(tài)不管有沒有使用始終為1。
第三個(gè)通道為ETH網(wǎng)口通道,被ZDevelop軟件占用。
開啟網(wǎng)口自定義通訊,選擇port11,此時(shí)狀態(tài)如下:
網(wǎng)口自定義通訊使用OPEN #指令開啟,通過此指令選擇主從端。
OPEN #PORT, "mode", portnum [, ipaddress]
port:通訊通道,參見PORT描述,選擇自定義網(wǎng)絡(luò)通道。
mode:訊主從,“TCP_CLIENT”-從,“TCP_SERVER”–主,“UDP_CLIENT”-UDP從,“UDP_SERVER”–UDP主。
portnum:TCP或UDP端口號, 主端為本地端口號, 從端為對方端口號。
ipaddress:對方IP地址,字符串,從端的時(shí)候要提供。
UDP_SERVER必須先接收對方的數(shù)據(jù),才能發(fā)送回?cái)?shù)據(jù)(除非用PORT_TARGET先強(qiáng)制指定對方)。
UDP_CLIENT本地端口號隨機(jī),必須先發(fā)送給對方,對方才能知道端口號,此模式時(shí)不是指定對方的包會丟棄掉。
UDP自定義通訊需要4系列控制器20170628以上固件版本;XPLC系列控制器 20170702以上固件版本。
TCP在收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接,然后再傳輸數(shù)據(jù),大大提高了數(shù)據(jù)通信的可靠性。
UDP在收發(fā)數(shù)據(jù)前,不建立連接,當(dāng)它想傳送時(shí)就去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上,可能會丟包。UDP程序結(jié)構(gòu)較簡單,信息包比較小只有8個(gè)字節(jié),TCP的信息包有20個(gè)字節(jié)。
2.讀寫方法
讀寫指令與串口相同。UDP讀取時(shí)只能使用GET #語法4。
3.TCP通訊例程
使用自定義網(wǎng)口通道port11,程序如下。
OPEN #11, "TCP_SERVER",945 '使用自定義網(wǎng)口通道2,控制器作為主端,端口號945
GLOBAL tempchar
GLOBAL CONST datamax=20 '定義數(shù)組空間的大小
GLOBAL Data(datamax) '定義數(shù)組
GLOBAL datanum '定義數(shù)組編號
datanum=0
ClearData() '清空數(shù)組
WHILE 1
tempchar = 0 '清除之前的字符
GET #11,tempchar '獲取單個(gè)字符到tempchar
PRINT datanum,tempchar '打印出字符的ASCII碼
Data(datanum) = tempchar '保存到數(shù)組
datanum = datanum + 1
IF datanum = datamax THEN '超過數(shù)組空間,清空數(shù)組
datanum = 0
ClearData()
ENDIF
IF tempchar = 59 THEN '號終止位;
PRINT #11,"ok" '發(fā)送字符串
ENDIF
WEND
END
GLOBAL SUB ClearData()
FOR i = 0 TO datamax-1 '清除數(shù)組空間內(nèi)容
Data(i) = 0
NEXT
END SUB
運(yùn)行效果:
4.UDP通訊例程
使用自定義網(wǎng)口通道port11,程序如下。
OPEN #11, "UDP_SERVER",945 '使用自定義網(wǎng)口通道2,控制器作為主端,端口號945
GLOBAL CHARES
GLOBAL CONST datamax=10 '定義數(shù)組空間的大小
GLOBAL Data(datamax) '定義數(shù)組
ClearData() '清空數(shù)組
WHILE 1
CHARES=GET #11, Data, 10 '從通道11獲取數(shù)據(jù)到數(shù)組,數(shù)據(jù)長度設(shè)為10
IF CHARES > 0 THEN
Data(CHARES) = 0 '設(shè)置結(jié)束0
PRINT Data '打印字符串
ENDIF
WEND
END
GLOBAL SUB ClearData()
FOR i = 0 TO datamax-1 '清除數(shù)組空間內(nèi)容
Data(i) = 0
NEXT
END SUB
運(yùn)行效果:
正運(yùn)動技術(shù)運(yùn)動控制器的自定義通訊就講到這里,更多學(xué)習(xí)視頻及圖文詳解請關(guān)注我們的公眾號“正運(yùn)動小助手”。
本文由正運(yùn)動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
標(biāo)簽:
中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。