2013年10月25日 星期五

PLC-Modbus 資料傳送準備



ASCII



如上圖所示為Modbus-ASCII的傳送資料格式,
我把重點以用紅線標示(8bit),
什麼這個是重點?



因為目前的PLC絕大多是使用16bit/32bit,
但格式是8bit,所以我們要使用PLC的指令來轉換。
(PS:當然使用的數據都小於8bit內,就不需要轉換)

1.先認識你用的傳送/接收指令格式:
因為Modbus都是用7-8bit資料來傳送,以PLC一個D來說,可以傳送2個封包(4個字元)。
所以指令上就會有所差別:
有的指令,只抓D的低8位元,來傳送,高8位元忽略。
D1=2102H
D2=2304H
假設要傳送兩個封包,會傳02H,再傳04H。高8位元忽略。

有的指令,先傳送低8位元,再傳送高8位元。
D1=2102H
D2=2304H
假設要傳送兩個封包,會傳02H,再傳21H。
接收指令也是相同,先放在低8位元,再放高8位元。

2.PLC的資料都10進制數字在儲存,如果要傳ASCII,就需要轉換,你就需要
HEX 轉為ASCII(ASCI)==>
例:D10=2102H 用ASCI指令到D20 D21,D20=3132H="12",D21=3230H="20"
好像很奇怪,跟我們在讀取的習慣不同!?
配合上面的傳送指令來看,低8位元先送,再高8位元==> 先32H(D20L) -> 31H(D20H)-> 30H(D21L)-> 32H(D21H)
就會理解,接收是H沒錯

ASCII 轉為HEX(HEX)==>
例:D10=3334H="34" D11=3536H="56" 用HEX指令到D20 = 4365H
配合上面的傳送/接收指令來看,低8位元先收,再高8位元==> 先34H(D10L) -> 33H(D10H)-> 36H(D11L)-> 35H(D11H)
就會理解,接收的是4365H沒錯

BIN→BCD 變換(BCD)==>
如果要傳送到2102位址時,我們要傳2102H再轉ASCII傳送,
但一般在MOV D 直接填數字,K 都是10進制,,記得要用H才是16進制,
不然就要用BCD指令來轉換。
K2102=H836
K2102=>BCD指令=>H2102

BCD→BIN 變換(BIN)==>
跟BCD碼相同,把BCD碼轉BIN碼。
如果BCD碼有不是0-9的值,就ALARM。



上下8 位元互換(SWAP)==>
記錄一下,您可能會用到,高8元位,跟低8位元互換,就可以調整發送的順序。
我印象中,還有把多個低8位元,組成16位元的資料,
D1 D2 D3 D4 的低8位元,放到D10(D2D1) D11(D4D3)
跟16位元資料打散成多個8位元資料,但找不到相關資料,
但這些都是自已本身有用過的指令。

=======
以上的指令是台達PLC的指令,不代表所有PLC都相同

沒有留言:

張貼留言