通訊介面,分為有線、無線 ,詳細資訊可以參考 Wiki : [序列通訊]
工業常用通訊介面:RS232、RS485、RS422、Ethernet
常見接頭、孔位:
D-Sub
RJ-45
mini-DIN
端子台
RS232有標準Pin腳定義稱為RS232C,使用D-Sub接頭
腳位
|
簡寫
|
意義
|
說明
|
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 | 數據機通知電腦有電話進來。 |
COM Port 可能是 RS232 / RS485 / RS422,依裝置而定
以前電腦會有 RS232,現在幾乎都沒有了,除非買工業電腦,
工業電腦可能會有RS232/RS485/RS422
PLC、變頻器、驅動器等設備,通常為RS485/RS422,
RS232通常用在1對1的連線上。
RS485/RS422通常用在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 |
十六進制,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
|
_
|
或者考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出去。
沒有留言:
張貼留言