2014年9月24日 星期三

Modbus –使用ASCII

Modbus –使用ASCII


台達 變頻器透過RS485     MODBUS –ASCII格式

詢問:(功能碼=03H)                       17ASCII
開頭碼
站號
功能碼
起始位址
詢問個數
LRC檢查碼
結束碼
3AH


30H
33H










ODH
OAH

設定:(功能碼=06H)                       17ASCII
開頭碼
站號
功能碼
寫入位址
寫入數值
LRC檢查碼
結束碼
:


0
6










ODH
OAH
PS:手冊上看到的參數代號,即為通訊的寫入位址。
唯後2需改為16進制。

YAMATAKE 溫控器 透過RS485     MODBUS-ASCII格式

詢問(功能碼=03H)                        17ASCII
開頭碼
站號
功能碼
起始位址
詢問個數
LRC檢查碼
結束碼
:


0
3










ODH
OAH
同台達 變頻器

設定:(功能碼=10H)                       19+N*4ASCII
開頭碼
站號
功能碼
寫入位址
寫入數值1
寫入數據數
寫入數據數X2
LRC檢查碼
結束碼
:


1
0








0
0
0
1
0
2


ODH
OAH

開頭碼
站號
功能碼
寫入位址
寫入數值1
寫入數值2
寫入數據數
寫入數據數X2
LRC檢查碼
結束碼
:


1
0












0
0
0
2
0
4


ODH
OAH
Ps:寫入地址的在手冊後面有表格可查~
公式應該是+4000
例:
C-01=1201+4000=5201  要轉成16進制




G.OUTPUT指令格式:G.OUTPUT    Un    S1   S2   M1
(不可跟ZP.CSET & G.INPUT 同時執行)
S1=設定Channel NUMBER
S1+1=Error code(系統回傳)
S1+2=發送數量(WORD(預設)/BYTE)
(發送數量的單位,可以在96H(CH1)/136H(CH2)中來選擇~)
====
S2 發送資料的起始暫存器,發送的資料需連續。
====
M1 發送完畢信號(BIT)
M1+1=發送有錯誤。
====
BYTE為單位,16BIT(2BYTE)暫存器,可存2ASCII碼,會送出2~
8位元先送出:
例:D120=3031H èASCIIè先送1(31H),再送0(30H)
========
發送數量的單位,可以在96H(CH1)/136H(CH2)中來選擇~
96H=0CH1,以WORD來算發送數量。
136H=1CH2,以BYTE來算發送數量。

相同情形下,要發送D120的值=3031H  ASCII=10

WORD來算,要設定1
BYTE來算,要設定2
範例程式:



G.INPUT指令格式:G.INPUT    Un    S   D1   M2
(不可跟ZP.CSET & G.INPUT 同時執行)
S=Channel number
S+1=回傳錯誤碼(by system)
S+2=接收到的資料筆數(by system)
S+3=允許接收的資料筆數
D1=接收資料存放區
M2=接收完成(成功/失敗)(bit)
M2+1=接收失敗
====
X03/X0A=模組有接收到正常資料。(CH1/CH2)
X04/X0B=模組有接收到異常資料。
如果資料沒有被取走,信號會一直ON
可以利用這2個信號去觸發G.INPUT
G.INPUT讀取完成時X03/X0A,會馬上OFF
這時候跟G.INPUT的完成信號(D2)有點時間差~
所以利用X03/X0A來呼叫副程式接受資料時,
記得下降緣也再呼叫一次接收副程式。
否則因為X03/X0A OFF之後,D2會無法在副程式看到ON

範例程式:




ZP.CSET指令格式:ZP.CSET    “Un”    S1  S2  D1   M2
S1=Channel number
S2=0
S2+1=0正常。不等於0就是錯誤碼(by system)
S2+2=4  接收資料清除。(Receive data clear request)

D1 沒有使用
M2 清除指令完成
M2+1 清除動作中有異常~


範例程式:


D116=清除完成次數
D117=清除有異常





HABIN指令:
說明:將2個暫存器(4)內的ASCII,轉成16進制,存到另一個暫存器中~
例:
D101=3031H(ASCII=10)  D102=3233H(ASCII=32)
執行HABIN D101 D140
D140=1032H
PS:如果轉換到非16進制的碼,PLCERROR~
BINHA指令:
說明:將暫存器內的值轉進4ASCII碼,放在2個暫存器中~
例:
D140=0123H
執行BINHA D140 D101
D101=3130HèASCII=01
D102=3332HèASCII=23
PS:如果轉換到非16進制的碼,PLCERROR~

BTOW指令:
說明:將2個暫存器的低8位元,合併到一個暫存器中~
例:
D121=03H
D122=01H
BTOW D121 D130 K2            èK2表示合併的次數,可一次合併多個
                                                 èK4就會將D121~D124,合併到D130~D131
D130=0103H

WTOB指令:
說明:將1個暫存器內的值,拆成高低8bit,分存到2個暫存器。
例:
D130=0103H
WTOB D130 D121 K2
D121=03H
D122=01H



假設:需輸出
:010321020002D7(0DH)(0AH)
利用G.OUTPUT指令,暫存器內容需排成以下~
位址
內容
(16進制)
ASCII

120
303AH
:0
121
3031H
10
122
3233H
32
123
3031H
10
124
3032H
20
125
3030H
00
126
4432H
2D
127
0D37H
7
128
000AH

利用副程式將依下內容,轉變成以上的表格才能發送出去。
位址
內容
(16進制)

位址
內容

位址
內容
130
01H

140
03H
151
0103H
131
03H
è
141
01H
BTOW
è
152
2102H
132
2102H

142
2102H
153
0002H
133
0002H

143
0002H




位址
內容

位址
內容
160
3130H

170
30H
BINHA
è
161
3330H
WTOB
è
171
31H
162
3132H

172
30H
163
3230H

173
33H
164
3030H

174
32H
165
3230H

175
31H




176
30H
177
32H
178
30H

179
30H

180
30H

181
32H





位址
內容

位址
內容


169
3AH

190
303AH

170
30H

191
3031H


è
171
31H
BTOW
è
192
3233H


172
30H

193
3031H


173
33H

194
3032H
G.output

174
32H

195
3030H


175
31H

196
0032H


176
30H



177
32H


178
30H



179
30H



180
30H



181
32H





傳送副程式動作說明:
指令格式:
CALL
P2
H01(2)
H03(2)
H2102(4)
H0002(4)
M10


站號
指令
位址
個數
傳送完信號
1.先製做LRC(檢查碼)
LRC的製做=01H+03H+21H+02H+00H+02H=29H,取2的補數èD7H
D150=0 ç存放LRC
FD0放到D140
FD1 放到D141
FD2 利用WTOB,拆到D142D143
FD3利用WTOB,拆到D144D145
D150=D140+D141+D142+D143+D144+D145
D150利用NEG指令,對自已取2補數

PS:
H2102 利用WTOB指令,可以拆開21H02H
NEG指令,對自已取2補數

2轉成ASCII(1WORD2ASCII,低位元先發送)
利用BTOW指令,將FD0 FD1合成放在 D130=(0103H)
FD2放在D131
FD3放在D132
利用BTOW指令 D150(LRC)0DH,合成放在D133
利用BINHA指令 D130(0103H),變成D120(01) D121(03) ASCII碼。
利用BINHA指令 D131(2102H),變成D122(21) D123(02) ASCII碼。
利用BINHA指令 D132(0002H),變成D124(00) D125(02) ASCII碼。
利用BINHA指令 D133(D70DH),變成D126(D7) D127(0D) ASCII碼。
==================
由於需要開頭碼『: (0AH)』所以擺放順序不一樣~
先將D120~D127 14BYTE,拆開到D141~D144
D1400AH D155放結尾碼0DHD1560AH
再利用BTOW指令,將D140~D156合成到D120~D128~發送出去~
PS:
H2102 經過BINHA指令 變成ASCII ,且存放在2 D3231H 3032H



接收副程式說明:
CALL P3 K10
(K10表示接收ASCII碼的數量(不包含起始結束碼))

D250~D254:以4位數擺放~
D260~D280:以2位數擺放~

例:接收到的資料為~
:0103041770000071 0DH 0AH 19~
CALL P3 K16  <<表示取16ASCII碼,不含開頭
注意:不能取到非16進制的值(0-9A-F ),不然轉換會錯誤。
起始碼3AH、結尾碼0DH _0AH,就是非16進制的值。

D250=0103H
D251=0417H
D252=7000H
D253=0071H

D260=01H
D261=03H
D262=04H
D263=17H
D264=70H
D265=00H
D266=00H
D267=71H

如果要合併,請BTOW指令~
如果回併D263&D264
BTOW D263 D270 K2  èD270=1770H





SWITCH設定 switch3=05D0 switch4=0006
CH1 SWITCH 1/2
CH2 SWITCH 3/4

SWITCH 1/3        8-15bit 設定傳輸速度=05=9600bps



Switch 2/4 =6  non procedure protocol~

沒有留言:

張貼留言