有人一直問我有關於通訊的問題,
說怎麼樣才能跟我一樣,
但基於學習背景與工作性質的不同,
一個寫PC程式的,一個寫PLC程式的,
大部分都是經驗談,我只懂得一招半式,他就快把我當神了,
我只覺得,專業的事情,交給專業人士去處理就好,
只要想辦法把自己的專業更精進,你也是那領域的專業人士,
雖然我是5分鐘處理掉他卡了一週的問題,也不用崇拜到這種地步...該從何說起呢?
通訊知識很廣,就跟學資訊一樣廣,但是以下我要說的內容,未必是正確的,請慎讀。
通訊介面,分為有線、無線 ,
底層跟電子相關的部分我就不做說明,因為我也不懂,或者說,我沒興趣去了解,
什麼電位、時序圖、射頻、波長、調幅、調頻的,這些我都瞄過一眼就跳過的內容。
但常用的名詞,大概就是串列傳輸,常見的英文大概就是serial、UART(Universal Asynchronous Receiver/Transmitter )
工業常用通訊介面:COM Port (RS232、RS485、RS422)、Ethernet 、端子台)
常見線頭:DE-9 (9 Pin D型頭)、RJ45、8pin miniDIN(圓頭)
Ethernet用:RJ45
COM Port 用:9 Pin D型頭、8pin miniDIN 圓頭、端子台
COM Port Pin腳定義,依照各家廠商而會有所不同,RS232有標準Pin腳定義稱為RS232C,
腳位 |
簡寫 |
意義 |
說明 |
Pin1 |
CD |
Carrier Detect |
數據機通知電腦有載波被偵測到。 |
Pin2 |
RXD |
Receiver |
接收資料。 |
Pin3 |
TXD |
Transmit |
傳送資料。 |
Pin4 |
DTR |
Data Terminal Ready |
電腦告訴數據機可以進行傳輸。 |
Pin5 |
GND |
Ground |
地線。 |
Pin6 |
DSR |
Data Set Ready |
數據機告訴電腦一切準備就緒。 |
Pin7 |
RTS |
Request To Send |
電腦要求數據機將資料送出。 |
Pin8 |
CTS |
Clear To Send |
數據機通知電腦可以傳資料過來。 |
Pin9 |
RI |
Ring Indicator |
數據機通知電腦有電話進來。 |
(RS232 邏輯1:-3~-25V, 邏輯0:3~25V)
(TTL 邏輯1:3.3~5V, 邏輯0:0V)
(RS485 邏輯1:2~6V, 邏輯0:-2~-6V)
RS232通常被廣義定義為COM Port,例如你看到9-Pin D型頭的線,你只會說那是RS232的線,
但它可能是RS232 / RS485 / RS422,依裝置而定,還可能會跳線,依設備定義的腳位接線,
如電腦使用RS232C,
如三菱PLC,依設定,可為RS232C,可為RS485,
如寶元IFC,可為RS485,可為RS422。
RS232通常用在1對1的連線上。RS485/RS422通常用在1對1或1對多。
開發常用轉換,看應用需求決定。
USB 轉 COM Port
Ethernet 轉 COM Port
COM Port 轉 COM Port
設備可參考台達、Trycom ... 等。
RS485/RS422兩者無法直接連接RS232,需轉換器。
RS485與RS422可以混用。如下圖。
這種方式會將S-與R-短路,S+與R+短路,將RS422當作RS485一樣剩下2線。
要注意透過轉換到RS232時,因為S(TX)與R(RX)短路了,傳給別人的命令會被自己收到,要再處理,將它PASS掉。
怎麼PASS...我是沒有試過,一般都是設備PASS掉,我都是用RS422轉USB,或者RS485轉USB,
還沒有串在有RS422與RS485共存的環境下,是不是用RTS?交給各位先進測試了。
COM Port 的設定,設定方式決定封包怎麼解,這部分就不是我有興趣的部份了,關係到時序圖。
要設定Port、鮑率、資料位元、停止位元、檢查位元,設定對了,資料解了才是對的。
相較之下,Ethernet容易多了,只要設定對IP與Port,資料就會收的到了,沒有解封包問題,解封包網路七層都幫你做好了。
遠程終端單元RTU (Remote Terminal Unit):
控制器、變頻器、驅動器、印表機、掃瞄機、條碼機、人機…等可連線設備
說到這個要扯一下ModBus,有些傳輸方式,要抱怨一下,有人把它分為ASCII模式與RTU模式,
明明就是ASCII模式與數值模式...只是ASCII模式只是將數值轉為字串而以 ,
EX: 傳送數值的 0x10 變成傳送字串的 "10",字串"10"對映到ASCII表查值,也就是變成0x31 0x30,
ㄜ...我這個寫法大概只有寫C++的人看得懂,請多包涵了。
計算機概念 :
編碼,基本上,是一種解讀方式,
在數位、或暫存器中,對我而言,我認為它只有0跟1,看是幾bit為解讀的單位而以。
什麼是bit,bit是數位中最小的單位,用來儲存0或1的數值,一個暫存器中會規劃數個bit。
除了bit這個單位,當然還有其他單位了,最常見的就是byte了,
一般在數這些bit,都少不了用byte,而其它單位又以byte單位延伸,
而這些單位,有些人會寫複數單位,有些人不會,所以會看到bits、bytes,
8 bits = 1 byte,很多地方會翻字節
1 byte = char,很多地方會翻字節
2 bytes = WORD,很多地方會翻字
4 bytes = DWORD,Double Word的縮寫,很多地方會翻雙字
了解完了單位,那這一連串的bit 該怎麼解讀呢,那就出現了二進制,英文binary,縮寫Bin,
一般都將最小的bit放在最右邊,但有些習慣用暫存器表示的作者,會將最小放在最左邊,
十進制 | 二進制 | 十六進制 | 八進制 |
0 | 0000 | 0 | 0 |
1 | 0001 | 1 | 1 |
2 | 0010 | 2 | 2 |
3 | 0011 | 3 | 3 |
4 | 0100 | 4 | 4 |
5 | 0101 | 5 | 5 |
6 | 0110 | 6 | 6 |
7 | 0111 | 7 | 7 |
8 | 1000 | 8 | 10 |
9 | 1001 | 9 | 11 |
10 | 1010 | A | 12 |
11 | 1011 | B | 13 |
12 | 1100 | C | 14 |
13 | 1101 | D | 15 |
14 | 1110 | E | 16 |
15 | 1111 | F | 17 |
但一般我們方便讀取的是10進制,若是工程師,方便讀取的可能就是16進制了,若是設備,有些會規劃8進制
十六進制,Hexadecimal,縮寫Hex,如上表所示,
八進制,Octal,縮寫Oct,如上表所示,尤其是PLC,
十進制,Decimal,縮寫Dec,
囉嗦了老半天,這跟通訊有關嗎?
如果不會解讀,怎麼知道傳的是對的還是錯的?
那繼續講...
那這堆0跟1還能怎麼解讀?
常見的還有ASCII,分可見與不可見,下表從wiki來的
不可見字元:
十進位 |
十六進位 |
縮寫 |
名稱/意義 |
|
0 |
0 |
NUL |
空字元(Null) |
|
1 |
1 |
SOH |
標題開始 |
|
2 |
2 |
STX |
本文開始 |
|
3 |
3 |
ETX |
本文結束 |
|
4 |
4 |
EOT |
傳輸結束 |
|
5 |
5 |
ENQ |
請求 |
|
6 |
6 |
ACK |
確認回應 |
|
7 |
7 |
BEL |
響鈴 |
|
8 |
8 |
BS |
退格 |
|
9 |
9 |
HT |
水平定位符號 |
|
10 |
0A |
LF |
換行鍵 |
|
11 |
0B |
VT |
垂直定位符號 |
|
12 |
0C |
FF |
換頁鍵 |
|
13 |
0D |
CR |
Enter鍵 |
|
14 |
0E |
SO |
取消變換(Shift out) |
|
15 |
0F |
SI |
啟用變換(Shift in) |
|
16 |
10 |
DLE |
跳出資料通訊 |
|
17 |
11 |
DC1 |
裝置控制一(XON 啟用軟體速度控制) |
|
18 |
12 |
DC2 |
裝置控制二 |
|
19 |
13 |
DC3 |
裝置控制三(XOFF 停用軟體速度控制) |
|
20 |
14 |
DC4 |
裝置控制四 |
|
21 |
15 |
NAK |
確認失敗回應 |
|
22 |
16 |
SYN |
同步用暫停 |
|
23 |
17 |
ETB |
區塊傳輸結束 |
|
24 |
18 |
CAN |
取消 |
|
25 |
19 |
EM |
連線介質中斷 |
|
26 |
1A |
SUB |
替換 |
|
27 |
1B |
ESC |
退出鍵 |
|
28 |
1C |
FS |
檔案分割符 |
|
29 |
1D |
GS |
群組分隔符 |
|
30 |
1E |
RS |
記錄分隔符 |
|
31 |
1F |
US |
單元分隔符 |
|
127 |
7F |
DEL |
刪除 |
可見字元
十進位 |
十六進位 |
圖形 |
十進位 |
十六進位 |
圖形 |
十進位 |
十六進位 |
圖形 |
||
32 |
20 |
(space) |
64 |
40 |
@ |
96 |
60 |
` |
||
33 |
21 |
! |
65 |
41 |
A |
97 |
61 |
a |
||
34 |
22 |
" |
66 |
42 |
B |
98 |
62 |
b |
||
35 |
23 |
# |
67 |
43 |
C |
99 |
63 |
c |
||
36 |
24 |
$ |
68 |
44 |
D |
100 |
64 |
d |
||
37 |
25 |
% |
69 |
45 |
E |
101 |
65 |
e |
||
38 |
26 |
& |
70 |
46 |
F |
102 |
66 |
f |
||
39 |
27 |
' |
71 |
47 |
G |
103 |
67 |
g |
||
40 |
28 |
( |
72 |
48 |
H |
104 |
68 |
h |
||
41 |
29 |
) |
73 |
49 |
I |
105 |
69 |
i |
||
42 |
2A |
* |
74 |
4A |
J |
106 |
6A |
j |
||
43 |
2B |
+ |
75 |
4B |
K |
107 |
6B |
k |
||
44 |
2C |
, |
76 |
4C |
L |
108 |
6C |
l |
||
45 |
2D |
- |
77 |
4D |
M |
109 |
6D |
m |
||
46 |
2E |
. |
78 |
4E |
N |
110 |
6E |
n |
||
47 |
2F |
/ |
79 |
4F |
O |
111 |
6F |
o |
||
48 |
30 |
0 |
80 |
50 |
P |
112 |
70 |
p |
||
49 |
31 |
1 |
81 |
51 |
Q |
113 |
71 |
q |
||
50 |
32 |
2 |
82 |
52 |
R |
114 |
72 |
r |
||
51 |
33 |
3 |
83 |
53 |
S |
115 |
73 |
s |
||
52 |
34 |
4 |
84 |
54 |
T |
116 |
74 |
t |
||
53 |
35 |
5 |
85 |
55 |
U |
117 |
75 |
u |
||
54 |
36 |
6 |
86 |
56 |
V |
118 |
76 |
v |
||
55 |
37 |
7 |
87 |
57 |
W |
119 |
77 |
w |
||
56 |
38 |
8 |
88 |
58 |
X |
120 |
78 |
x |
||
57 |
39 |
9 |
89 |
59 |
Y |
121 |
79 |
y |
||
58 |
3A |
: |
90 |
5A |
Z |
122 |
7A |
z |
||
59 |
3B |
; |
91 |
5B |
[ |
123 |
7B |
{ |
||
60 |
3C |
< |
92 |
5C |
\ |
124 |
7C |
| |
||
61 |
3D |
= |
93 |
5D |
] |
125 |
7D |
} |
||
62 |
3E |
> |
94 |
5E |
^ |
126 |
7E |
~ |
||
63 |
3F |
? |
95 |
5F |
_ |
看完ASCII 表之後,考考大家,常用的Tab鍵,它的ASCII 是什麼呢?
或者考CR與LF的功用為何?
如果我是老師,我應該會Open Book 可這些題...呵呵呵...
還能怎麼解讀?來從暫存器解讀好了。
暫存器一般會規劃 8bit、16bit、32bit為儲存單位。
這些儲存單位又分為有號數與無號數。有號數就要用2的補數解讀,
有無號數是對設備而言的解讀方式,規劃的人定義給它。
當資料透過通訊讀取回來,你必須知道設備裡的定義,所以通常寫程式的人會寫規畫書裡,方便維護的人解讀。
其它人要用那些暫存器時,才知道裡面的數值是什麼。
比方說我讀一個8bit的資料,二進制解讀是11111111,
十進制要如何解讀?若是有號數,是-1,若是無號數是255,
沒搞清楚是會撞車的!
所以了解暫存器結構、定義,很重要!
那...什麼是二的補數...二的補數是用來表示二進制的負數,
二進制是以最高位元判斷為負數。
方法:反向+1,
EX(轉8 bit 的二進制) : 我要得到十進制的 -1 ,
首先,先將十進制轉的1轉為二進制,
十進制的 1 等於二進制的00000001 反向為 11111110,+1= 11111111,
傳輸協定:
工業常用在PLC的傳輸協定大概就是ModBus了,
其它設備自己也都有自家的傳輸協定,
最近的話,MT-Connnect 與 OPC UA 很熱門,有興趣的人可以去攻略!
我現在還沒攻下來!這是題外話!
那傳輸協定中常用的ASCII 符號是CR、LF,無論在ModBus或者其他協定上。
以16進制數值來說,一個是0x0D,一個是0x0A,
為什麼常用呢?
以文字檔來說一個是回車,一個是換行,方便用記事本開啟,
以C++來說一個是'\r',一個是'\n',方便console printf,
ModBus:
一般ModBus會有表頭、從站Slave、功能Function、暫存器位址Address、長度、資料、CRC檢查碼、表尾,
如下圖,這是台達PLC的傳輸,但這個表會讓人誤解,因為我用ASCII模式,實際傳的資料是《:010106140025BD<CR><LF>》共17 Bytes
所有Byte 用數值表示<0x3A><0x30><0x31><0x30><0x31><0x30><0x36><0x31><0x34><0x30><0x30><0x32><0x35><0x42><0x46><0x0D><0x0A>
0x3A為表頭的冒號,CR與LF在ASCII中是不可見的表尾。
通訊大致上就是這樣,通常,手冊都是人寫的,人寫的就會有出錯的機會,
像台達的這份文件就是個錯誤示範,
其它的像試CRC檢查碼的高Byte 低Byte寫反的啦,
或者設備迴路測試的時候CRC檢查碼放反的BUG,
在手冊正中央跟你說明底線是space的陷阱啦,就考驗你有沒有仔細先看完前面,直接跳指令讓你穩死的,
以為你一定懂這就是ASCII,不告訴你CR,LF是什麼的啦,就乖乖照著傳就錯了。
自訂的通訊協定,在三菱PLC手冊會跟你說...無協定傳輸...感覺像一種...非ModBus就是無協定一樣...
我隨便抓了個Epson的Barcode機
這樣應該看得懂是什麼了吧?
GS是ASCII中的代號,查表為1D,其它括號就是括號,L就是L,GS(L = 0x1D 0x28 0x4C,一切都查表
其它的參數,都有說明數值是多少,將那些數值轉成十六進制,就能得到那行 HEX 了,共傳11 Bytes出去。
我的問卷調查
相關文章:
留言列表