Modbus –使用ASCII
台達 變頻器透過RS485 MODBUS –ASCII格式
詢問:(功能碼=03H) 共17個ASCII碼
開頭碼
|
站號
|
功能碼
|
起始位址
|
詢問個數
|
LRC檢查碼
|
結束碼
|
||||||||||
3AH
|
|
|
30H
|
33H
|
|
|
|
|
|
|
|
|
|
|
ODH
|
OAH
|
設定:(功能碼=06H) 共17個ASCII碼
開頭碼
|
站號
|
功能碼
|
寫入位址
|
寫入數值
|
LRC檢查碼
|
結束碼
|
||||||||||
:
|
|
|
0
|
6
|
|
|
|
|
|
|
|
|
|
|
ODH
|
OAH
|
PS:手冊上看到的參數代號,即為通訊的寫入位址。
唯後2碼 需改為16進制。
YAMATAKE 溫控器 透過RS485 MODBUS-ASCII格式
詢問:(功能碼=03H) 共17個ASCII碼
開頭碼
|
站號
|
功能碼
|
起始位址
|
詢問個數
|
LRC檢查碼
|
結束碼
|
||||||||||
:
|
|
|
0
|
3
|
|
|
|
|
|
|
|
|
|
|
ODH
|
OAH
|
同台達 變頻器
設定:(功能碼=10H) 共19+N*4個ASCII碼
開頭碼
|
站號
|
功能碼
|
寫入位址
|
寫入數值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進制
(不可跟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)暫存器,可存2個ASCII碼,會送出2次~
低8位元先送出:
例:D120=3031H èASCIIè先送1(31H),再送0(30H)
========
發送數量的單位,可以在96H(CH1)/136H(CH2)中來選擇~
96H=0,CH1,以WORD來算發送數量。
136H=1,CH2,以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進制的碼,PLC會ERROR~
BINHA指令:
說明:將暫存器內的值轉進4個ASCII碼,放在2個暫存器中~
例:
D140=0123H
執行BINHA D140 D101
D101=3130HèASCII=01
D102=3332HèASCII=23
PS:如果轉換到非16進制的碼,PLC會ERROR~
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,拆到D142、D143
FD3利用WTOB,拆到D144、D145
D150=D140+D141+D142+D143+D144+D145
D150利用NEG指令,對自已取2補數
PS:
H2102
利用WTOB指令,可以拆開21H、02H
NEG指令,對自已取2補數
2轉成ASCII碼(1WORD放2個ASCII,低位元先發送)
利用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碼。
==================
由於需要開頭碼『: (0A H)』所以擺放順序不一樣~
先將D120~D127 14個BYTE,拆開到D141~D144
D140放0AH ,D155放結尾碼0DH,D156放0AH
再利用BTOW指令,將D140~D156合成到D120~D128中~發送出去~
PS:
H2102
經過BINHA指令 變成ASCII碼 ,且存放在2 個D中3231H 、3032H。
接收副程式說明:
CALL P3 K10
(K10表示接收ASCII碼的數量(不包含起始結束碼))
D250~D254:以4位數擺放~
D260~D280:以2位數擺放~
例:接收到的資料為~
:0103041770000071 0DH 0AH 共19碼 ~
CALL P3 K16
<<表示取16個ASCII碼,不含開頭
注意:不能取到非16進制的值(0-9、A-F ),不然轉換會錯誤。
起始碼3A H、結尾碼0DH _0A H,就是非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~
沒有留言:
張貼留言