目前副程式是依照台達變頻器控制用~

未來接觸其他類似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=3130HASCII=01

D102=3332HASCII=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~