目前副程式是依照台達變頻器控制用~
未來接觸其他類似MODBUS控制,會再修改~~
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進制
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)暫存器,可存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碼。
==================
由於需要開頭碼『: (0AH)』所以擺放順序不一樣~
先將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 ),不然轉換會錯誤。
起始碼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~