1、松下PLC使用COM0端口,RS232接線。電腦端使用USB轉RS232序列槽線。
硬體接線,RS232接線:
電腦端序列槽線: PLC側COM0:
2 RXD 接收資料 SD 發送資料
3 TXD 發送資料 RD 接收資料
5 GND 信号地 SG 信号地
2、PLC側參數設定:
站号:1;
通訊模式:MODBUS RTU;
速率(波特率):9600;
資料長度:8位;
奇偶校驗:奇校驗;
停止位:1
3、八方彙序列槽調試軟體側設定:
通訊參數設定和PLC要一緻,裝置位址就是需要通訊的PLC的站号,這裡是01(PLC側 NO.410站号 1)。
4、八方彙調試神器有一點需要注意的地方:顯示的起始位址範圍要包含讀寫寄存器位址的範圍,否則,将會出現讀寫寄存器位址無法寫入位址的情況。如下圖:
圖中①中的位址範圍是從0開始,顯示連續的8個位址。②中的位址範圍是從0開始,讀寫1個位址。
那麼我就可以在②的讀寫寄存器位址裡輸入任意的0-7的數字,但不能超過7,超過7就會報錯。因為①中位址範圍最大就是7。
輸入7以内的數字,都可以正常輸入。
但是,當輸入7以上的數字時就會報錯。這一點對這個軟體需要特别注意。
如果需要更大的位址,隻需把①中的顯示範圍包含②中需要填的位址,就可以正常在②中輸入了。
5、在FP-XH的使用者手冊-通訊篇中,有關于PLC進行MODBUS通訊時的位址對照表
這張表裡包含了讀寫不同類型位址時需要使用的功能碼和對應位址。需要注意的是紅色框裡代碼就是MODBUS通訊時的功能碼,這裡是以10進制列出的,應用的時候注意轉換成16進制。例如:代碼16是DT多字寫入,用序列槽軟體發封包時,功能碼應轉換成16進制,也就是10,十進制的16=十六進制的10
6、MODBUS 功能碼及其含義
MODBUS RTU 錯誤應答的規定:
松下FP-XH PLC側響應規則
下面進入重點,各個功能和位址讀寫操作的應用例子
如:讀取PLC的Y6的狀态
發送:01 01 00 06 00 01 1D CB
接收:01 01 01 01 90 48
下圖是MODBUS RTU協定規定的封包資料格式
封包解讀:
發送資料格式解讀
圖檔中顯示出了發送資料各個碼占用的位數(每兩位代表1個位元組的資料長度=8bit),這裡都是16進制。如上圖,起始位址占用4個位。
起始碼:3.5個字元以上時間的間隔。
位址碼01:讀取站号為1裝置的資料。
功能碼01:讀的是線圈類型的資料。
起始位址00 06:讀取資料的起始位址是6,類型是Y點。為什麼是Y點,是因為上面的PLC位址對照表裡規定的,線圈中0000-06DF對應Y0-Y109F,看下圖紅色框裡。
讀取個數00 01:讀取資料的數量是1個。
校驗碼1D CB: CRC檢驗的值。
停止碼:3.5個字元以上時間的間隔。
接收資料格式解讀
圖檔中顯示出了接收資料各個碼占用的位數(每兩位代表1個位元組的資料長度=8bit),這裡都是16進制。如上圖,傳回資料占用2個位。
起始碼:3.5個字元以上時間的間隔。
位址碼01:傳回站号為1裝置的資料。
功能碼01:傳回的是線圈類型的資料。
讀取個數01:傳回資料的長度是1個位元組。(讀取個數這裡的數字代表傳回的資料長度,機關是位元組。1個位元組=8bit)。
傳回資料01:傳回的資料為H01,【因為傳回1個位元組的資料,是以這個資料存儲在低8位中,因為讀取資料的起始位址是Y6,傳回的資料=H01=B00000001,是以Y6=bit0=1】
校驗碼90 48: CRC檢驗的值。
停止碼:3.5個字元以上時間的間隔。
即我們讀取的1号站線圈類型,位址為Y6的線圈目前狀态為ON。
如果需要讀取Y300-Y309一共10個點狀态要怎麼發送封包?
發送:01 01 01 E0 00 0A BC 07
接收:01 01 02 A4 00 C3 3C
發送前,序列槽軟體位址設定,如下圖:
發送後封包,如下圖:
傳回結果,如下圖
PLC側資料狀态
序列槽軟體顯示狀态與PLC監控狀态一緻。
封包解讀:
發送資料格式解讀
圖檔中顯示出了發送資料各個碼占用的位數(每兩位代表1個位元組的資料長度=8bit,每4位代表1個字的資料長度),這裡都是16進制。
起始碼:3.5個字元以上時間的間隔。
位址碼01:讀取站号為1裝置的資料。
功能碼01:讀的是線圈類型的資料。
起始位址01 E0:讀取資料的起始位址是Y300,類型是Y點。為什麼是Y點,是因為下圖的PLC位址對照表裡規定的,線圈中0000-06DF對應Y0-Y109F,看下圖紅色框裡。【為什麼位址是01 E0,下面有詳細解釋位址對應的問題】(*注1)
讀取個數00 0A:讀取資料的數量是連續的10個,從Y300開始到Y30A。(這裡是16進制,HA=K10)
校驗碼BC 07: CRC檢驗的值。
停止碼:3.5個字元以上時間的間隔。
接收資料格式解讀
圖檔中顯示出了接收資料各個碼占用的位數(每兩位代表1個位元組的資料長度=8bit),這裡都是16進制。
起始碼:3.5個字元以上時間的間隔。
位址碼01:傳回站号為1裝置的資料。
功能碼01:傳回的是線圈類型的資料。
讀取個數02:傳回資料的長度是2個位元組(1個位元組=8bit,2個位元組=16bit=1個字)。
傳回資料1 A4:傳回的第一個資料是HA4。HA4=B10100100(H代表16進制,B代表2進制)
傳回資料2 00:傳回的第二個資料是H00。H00=B00000000
把傳回資料1和傳回資料2組合起來就是0000 0000 1010 0100(即bit2=Y302=1,bit5=Y305=1,bit7=Y307=1,這和上圖序列槽軟體中顯示是一樣的。)
MODBUS RTU 功能碼01, 傳回資料是按位元組處理的,1個字=2個位元組=16bit。上面傳回2個位元組,存放資料需要占用1個字,傳回資料1存放在低8位中,傳回資料2存放在高8位中。假如傳回4個位元組,資料存放需要占用2個字,傳回資料1存放在第一個字的低8位中,傳回資料2存放在第一個字的高8位中;傳回資料3存放在第二個字的低8位中,傳回資料4存放在第二個字的高8位中。當傳回更多資料時,按此規律遞推。是以我們處理接收到的資料時,需要把1個字的高8位和低8位進行互換,再重新組合成1個字,才能得到我們真正需要的資料,因為MODBUS RTU傳回資料協定格式就是低位在前高位在後,而一個正常的資料是高位在前低位在後,是以需要處理。例如上面接收到的資料(資料1和資料2合起來)為HA400=B1010 0100 0000 0000,很顯然這不是我們需要的資料。這是因為對于2進制來說左側是高位右側是低位,從左往右排就是從高位往低位排列。是以我們需要把1個字的高低位元組互換處理,得到的資料是H00A4=0000 0000 1010 0100這才是真實的資料。
校驗碼C3 3C: CRC檢驗的值。
停止碼:3.5個字元以上時間的間隔。
即我們讀取的1号站線圈類型,起始位址為Y300連續讀取10個資料,傳回的資料為HA400=B1010 0100 0000 0000。
(*注1)下面開始解釋位址對應的問題
需要讀取資料的起始位址為Y300,為什麼發送封包時的起始位址為01E0?
上表我們看到Y0-Y109F對應的BUS上的資料(16進制)為0000-06DF,即Y0對應0000,Y109F對應06DF。按照此表規定的規則,那麼Y10對應0010,Y5F對應005F,Y90對應0090,Y9F對應009F;下面關鍵問題來了Y100對應多少?按照上面的規則我們很容易會說Y100對應0100,真是如此嗎?正确的答案是Y100對應00A0。是不是出乎你的意外?
這是因為松下PLC的X/Y/R位址是16進制非連續排列的。Y的位址排列為Y0-YF,Y10-Y1F......Y90-Y9F這一段Y0-Y9F是連續排列的。那麼按16進制排列9F後面的一個數應該是A0,但松下PLC的下一個起始位址是Y100,跳過了中間的一段(A0-FF)不是YA0!
繼續往下排列Y100-Y19F又是連續排列的,但是從Y200開始又跳過了中間的一段(1A0-1FF),變成了Y200-Y29F。下面是Y300-Y39F,Y400-Y49F.......
即松下PLC位址每遇到9F(H9F=10進制159)資料位址就會跳段改變,也就是說從起始位址每隔160個資料(0-159一共160個),就會改變位址起始編号。那麼按照此規則Y0-Y109F一共有多少個資料呢?答案:11*160=1760。這是因為,從Y0-Y109F,一共有11個位址段,每個位址段從對應的0開始到9F一共有160個資料,那麼總數就是11*160=1760。
而上表中給出的PLC的Y位址對應的BUS位址卻是連續排列的,從0000到06DF即十進制的0到1759,一共有1760個。把BUS位址和PLC位址一一對應起來,那麼Y300就對應BUS的01E0。這就是上面問題的答案。
BUS位址在對應區間内都是連續排列的。
下面附上幾張位址對應圖,以友善了解。
這是X位址的對應BUS位址表,規則同上面的解釋,圖中隻列出了部分資料。
這是Y位址的對應BUS位址表,規則同上面的解釋,圖中隻列出了部分資料。
這是R位址的對應BUS位址表,規則同上面的解釋,圖中隻列出了部分資料。
R位址對應的BUS位址是0800-27FF,這裡要特别注意
這是R位址的對應BUS位址表,規則同上面的解釋,圖中隻列出了部分資料。
R位址對應的BUS位址是0800-27FF,這裡要特别注意
9、讀單個R點,功能碼用H01,接收到的資料需要高低位元組互換。
發送:01 01 08 A0 00 01 FF 88
接收:01 01 01 01 90 48
接收封包中的讀取個數表示的是傳回的位元組數。如上圖01表示傳回1個位元組。
讀多個R點,功能碼用H01,接收到的資料需要高低位元組互換。
發送:01 01 08 A0 00 10 3F 84
接收:01 01 02 01 05 78 6F
接收封包中的讀取個數表示的是傳回的位元組數。如上圖02表示傳回2個位元組。
讀單個X點,功能碼用H02,接收到的資料需要高低位元組互換。
發送:01 02 00 0F 00 01 89 C9
接收:01 02 01 01 60 48
接收封包中的讀取個數表示的是傳回的位元組數。如上圖01表示傳回1個位元組。
讀多個X點,功能碼用H02,接收到的資料需要高低位元組互換。
發送:01 02 00 00 00 10 79 C6
接收:01 02 02 00 80 B8 18
接收封包中的讀取個數表示的是傳回的位元組數。如上圖02表示傳回2個位元組。
讀單個DT資料,功能碼用H03,注意:H03功能碼,傳回的資料不需要進行高低位元組互換,可以直接使用。每個傳回資料存放占用1個字。
發送:01 03 00 42 00 01 24 1E
接收:01 03 02 31 24 AD CF
H3124=K12580
接收封包中的讀取個數表示的是傳回的位元組數。如上圖02表示傳回2個位元組。
讀多個DT資料,功能碼用H03,注意:H03功能碼,傳回的資料不需要進行高低位元組互換,可以直接使用。每個傳回資料存放占用1個字。
發送:01 03 00 42 00 0A 65 D9
接收:01 03 14 31 24 00 00 00 00 00 00 00 9F 00 00 00 00 01 AA 00 00 00 00 75 6A
傳回資料太多了,1張圖截不完,按順序看圖就好了。
接收封包中的讀取個數表示的是傳回的位元組數。如上圖14表示傳回20個位元組。(H14=K20)
單點寫Y點,功能碼用H05。正常時,接收的封包和發送的封包完全一樣。寫入的值為FF 00表示單個線圈置ON,這是規定的。
發送:01 05 02 80 FF 00 8C 6A
寫入的值為FF 00表示單個線圈置ON,這是規定的。
接收:01 05 02 80 FF 00 8C 6A
單點寫Y點,功能碼用H05。正常時,接收的封包和發送的封包完全一樣。寫入的值為00 00表示單個線圈置OFF,這是規定的。
發送:01 05 02 80 00 00 CD 9A
接收:01 05 02 80 00 00 CD 9A
如:需要把一個線圈置ON,在八方彙序列槽調試神器上要怎麼操作?
如下圖需要把Y400置1,具體操作流程如下:
1. 填入位址,Y400對應BUS 16進制位址0280,Y400是起始位=bit0位
2. 滑鼠左鍵單擊bit0位,bit0位的顯示狀态就會從OFF變為ON
3. 點選紅色框的發送
4.序列槽軟體自動生成封包,并把封包發送出去。
當需要把1個線圈置OFF時,隻需點選對應位,使其從ON變為OFF,再重複上面的步驟就可以了。
*注意2: 左上角選擇16進制時,顯示位址總個數/讀寫寄存器位址個數 在序列槽軟體上用10進制表示,發送和接收的封包都是用16進制處理的!這裡需要特别注意。
多點線圈寫Y點,功能碼用H0F。
發送:01 0F 02 80 00 10 02 FF FF DF 90
接收:01 0F 02 80 00 10 54 57
多點線圈寫Y點,功能碼用H0F。
發送:01 0F 02 80 00 11 03 00 00 00 9C 64
接收:01 0F 02 80 00 11 95 97
多點線圈寫Y點,功能碼用H0F。
發送:01 0F 0B 20 00 11 03 FF FF 01 4C 04
接收:01 0F 0B 20 00 11 96 29
單點DT寫入,功能碼用H06。
功能碼06,發送和接收封包一樣。
發送:01 06 05 A4 21 CB 91 22
接收:01 06 05 A4 21 CB 91 22
多點DT寫入,功能碼用H10。
發送:01 10 05 A4 00 03 06 00 3D 0A 35 00 6F 8E 24
上圖中的要寫入的個數代表寫入多少個字,如上圖0003代表寫入3個字=6個位元組。
接收:01 10 05 A4 00 03 C1 27
上圖中的寫入的個數代表寫入多少個字,如上圖0003代表寫入3個字
例如:在PLC的32位寄存器DT10中寫入值120000,要怎麼寫?
1、先把十進制轉成16進制,K120000=H0001D4C0。因為發送的時候資料是按字發送的,32位=2個字=4個位元組,不足4個位元組的高位補0。第一個字存放順序為D4 C0高位在前低位在後,第二個字存放順序為00 01高位在前低位在後。是以DT10中存放資料D4 C0,DT11中存放00 01。
2、發送多個字使用功能碼H10
3、發送封包:01 10 00 0A 00 02 04 D4 C0 00 01 8B DC
接收封包:01 10 00 0A 00 02 61 CA