close

有人一直問我有關於通訊的問題,

說怎麼樣才能跟我一樣,

但基於學習背景與工作性質的不同,

一個寫PC程式的,一個寫PLC程式的,

大部分都是經驗談,我只懂得一招半式,他就快把我當神了,

我只覺得,專業的事情,交給專業人士去處理就好,

只要想辦法把自己的專業更精進,你也是那領域的專業人士,

雖然我是5分鐘處理掉他卡了一週的問題,也不用崇拜到這種地步...該從何說起呢?

 

通訊知識很廣,就跟學資訊一樣廣,但是以下我要說的內容,未必是正確的,請慎讀。

通訊介面,分為有線、無線 ,

底層跟電子相關的部分我就不做說明,因為我也不懂,或者說,我沒興趣去了解,

什麼電位、時序圖、射頻、波長、調幅、調頻的,這些我都瞄過一眼就跳過的內容。

但常用的名詞,大概就是串列傳輸,常見的英文大概就是serial、UART(Universal Asynchronous Receiver/Transmitter )

工業常用通訊介面:COM Port (RS232RS485RS422)Ethernet 、端子台)

常見線頭:DE-9 (9 Pin D型頭)RJ458pin 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出去。

 

我的問卷調查

相關文章:

arrow
arrow
    全站熱搜

    史克威爾凱特 發表在 痞客邦 留言(2) 人氣()