2020年4月1日 星期三

通訊

2020.04.02 update:


通訊介面,分為有線、無線 ,詳細資訊可以參考 Wiki : [序列通訊]
工業常用通訊介面:RS232RS485RS422Ethernet






常見接頭、孔位:
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
但一般我們方便讀取的是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出去。


沒有留言:

張貼留言

文章測試

Test