S7 200 PPI編程口讀寫數據

最近在作的項目就是使用以下協議對200PLC進行數據讀寫的,基本上能夠完成讀寫功能(T、C這兩種類型暫時尚未成功,正在查找緣由)編程

上位機按以下的格式發讀寫指令,PLC做出接收正確的響應(返回應答數據E5H或F9H見下文分析),上位機接到此響應則發出確認命令(10 02 5C 5E 16),PLC再返回給上位機相應數據。網絡

SD LE LEr SD DA SA FC DSAP SSAP DU FCS ED
SD:開始符(68H) LE、Ler:長度(從DA到DU)
DA:目的地址 SA:源地址
FC:功能碼 (6CH) DSAP:目的服務存取點
SSAP:源服務存取點 DU:數據單元
FCS:校驗和 ED:結束符(16H)
3.1 讀命令分析
一次讀一條數據
對於一次讀取一個數據,讀命令都是33個字節。前面的0—21字節是相同的,爲 :
68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
由於是單片機上發的讀PLC數據的命令,SA=00,DA=02,若是有多個站,DA要改爲相應的站號。讀命令中從DA到DU的長度爲1B即27個字節。從22字節開始根據讀取數據的類型、位置不一樣而不一樣。表一是讀不一樣存儲器命令的Byte22—32。
字節 22 23 24 25 26 27 28 29 30 31 32
功能 讀取長度 數據個數* 存儲器類型 偏移量 校驗 結束
讀q0.0 01 00 01 00 00 82 00 00 00 64 16
讀m0.0 01 00 01 00 00 83 00 00 00 65 16
讀M0.1 01 00 01 00 00 83 00 00 01 66 16
讀SMB34 02 00 01 00 00 05 00 01 10 F9 16
讀VB100 02 00 01 00 01 84 00 03 20 8B 16
讀VW100 04 00 01 00 01 84 00 03 20 8D 16
讀vd100 06 00 01 00 01 84 00 03 20 8F 16
讀i0.5 01 00 01 00 00 81 00 00 05 68 16"
讀i0.7 01 00 01 00 00 81 00 00 07 6A 16"
表 一 讀命令的Byte22-32
從表中咱們能夠得出如下結果:
Byte 22 讀取數據的長度
01:1 Bit 02:1 Byte 
04:1 Word 06:Double Word
Byte 24數據個數,這裏是01 ,一次讀多個數據時見下面的說明。
Byte 26 存儲器類型,01:V存儲器 00:其它
Byte 27 存儲器類型
04:S 05:SM 06:AI 07:AQ 1E: C
81:I 82:Q 83:M 84:V 1F: T
Byte 28,29,30存儲器偏移量指針(存儲器地址*8),如:VB100,存儲器地址爲100,偏移量指針爲800,轉換成16進制就是320H,則Byte 28—29這三個字節就是:00 03 20。
Byte 31 校驗和,前面已說到這是從(DA+SA+DSAP+SSAP+DU) Mod 256 。
一次讀多條數據
對於一次讀多個數據的狀況,前21Byte與上面類似只是長度LD,LDr及Byte 14不一樣:
Byte 14 數據塊佔位字節,它指明數據塊佔用的字節數。與數據塊數量有關,長度=4+數據塊數*10,如:一條數據時爲4+10=0E(H);同時讀M,V,Q三個不一樣的數據塊時爲4+3*10=22(H)。
Byte 22 老是02 即以Byte爲單位。
Byte 24 以字節爲單位,連續讀取的字節數。如讀2個VD則Byte24=8
Byte 19---30 按上述一次讀一個數據的格式依次列出,
Byte 31---42 另外一類型的數據,也是按上述格式給出。
以此類推,一次最多讀取222個字節的數據。
3.2 寫命令分析
一次寫一個Double Word類型的數據,寫命令是40個字節,其他爲38個字節。
寫一個Double Word類型的數據,前面的0—21字節爲 :
68 23 23 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
寫一個其它類型的數據,前面的0—21字節爲 :(與上面比較,只是長度字節發生變化)
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
從22字節開始根據寫入數據的值和位置不一樣而變化。表二是幾個寫命令的Byte22—40。
字 節 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
寫入位置及值 長度 個數 類型 偏移量 位數 值、校驗碼、結束符
M0.0=1 01 00 01 00 00 83 00 00 00 00 03 00 01 01 00 71 16 
M0.0=0 01 00 01 00 00 83 00 00 00 00 03 00 01 00 00 70 16 
M0.1=1 01 00 01 00 00 83 00 00 01 00 03 00 01 01 00 72 16 
vb100=10 02 00 01 00 01 84 00 03 20 00 04 00 08 10 00 AE 16 
vb100=FF 02 00 01 00 01 84 00 03 20 00 04 00 08 FF 00 9D 16 
VW100=FFFF 04 00 01 00 01 84 00 03 20 00 04 00 10 FF FF A6 16 
VD100=FFFFFFFF 06 00 01 00 01 84 00 03 20 00 04 00 20 FF FF FF FF B8 16
表二 寫命令的Byte22—40
經分析咱們能夠得出如下結果:
Byte 22-- Byte 30 寫入數據的長度、存儲器類型、存儲器偏移量與讀命令相同。T,C等不能用寫命令寫入。 
Byte 32 若是寫入的是位數據這一字節爲03,其它則爲04
Byte 34 寫入數據的位數
01: 1 Bit 08: 1 Byte 10H: 1 Word 20H: 1 Double Word 
Byte 35--40值、校驗碼、結束符
若是寫入的是位、字節數據,Byte35就是寫入的值,Byte36=00,Byte37=檢驗碼,Byte38=16H,結束。若是寫個的是字數據(雙字節),Byte35,Byte36就是寫入的值, Byte37=檢驗碼,Byte38=16H,結束。若是寫個的是雙字數據(四字節),Byte35—38就是寫入的值, Byte39=檢驗碼,Byte40=16H,結束。
3.3 其它命令分析
強制寫入
I、Q、S 等不能使用上述的寫命令寫入數據,只能用強制寫入的方式。
前0—35字節值以下(長度字段要根據實際狀況而定),須要注意的是Byte8=07,
68 2B 2B 68 02 00 6C 32 07 00 00 00 00 00 0C 00 12 00 01 12 08 12 48 0B 00 00 00 00 00 FF 09 00 0E 00 01 10 
後面的內容以下:
Byte 32 佔位字節,從下一字節開始到校驗和前的字節數。說明同讀數據的Byte 14.
Byte 36 強制寫入數據的長度
01:1 Bit 02:1 Byte 
04:1 Word 06:Double Word
Byte 38 數據個數,這裏是01 ,一次強制寫多個數據時見下面的說明。
Byte 40 存儲器類型
Byte 41 存儲器類型,見讀命令的說明。
Byte 4二、4三、44存儲器偏移量指針(存儲器地址*8)
Byte 4五、4六、4七、48 值、校驗碼、結束符
取消強制寫
強制寫入I、Q 等後,這些值就不能被程序改變,除非使用」取消強制命令」。 取消強制命令的格式與強制寫入類似,變化的有如下幾點:(1)是沒有」值」這一段,即沒有Byte45—48。這影響到長度字節LE,LEr;佔位字節Byte 32.(2)Byte16=10H, (3) Byte32=0CH,也就是第一條,沒有」值」這一段,數據塊長度變短了。
對於一次強制寫入或取消多個數據的狀況能夠參照寫入命令寫出相應的報文,這裏再也不給出。
STOP命令
STOP命令使得S7-200 CPU從RUN狀態轉換到STOP狀態(此時CPU模塊上的模式開關開應打在RUN或TERM位置)。PC發出以下命令,PLC返回F9,此時PLC已進入等待狀態,PC再發確認報文(10 02 5C 5E 16),完成一個命令過程。
68 1D 1D 68 02 00 6C 32 01 00 00 00 00 00 10 00 00 29 00 00 00 00 00 09 50 5F 50 52 4F 47 52 41 4D AA 16
RUN 命令
RUN命令使得S7-200 CPU從STOP狀態轉換到RUN狀態(此時CPU模塊上的模式開關開應打在RUN或TERM位置)。PC發出下命令,PLC返回F9,此時PLC已進入運行狀態,PC再發確認報文(10 02 5C 5E 16),完成一個命令過程。
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 14 00 00 28 00 00 00 00 00 00 FD 00 00 09 50 5F 50 52 4F 47 52 41 4D AA 16 
3.4 讀出數據分析
一次讀出一條數據
PLC響應的數據也是用PPI封裝的。若是用一次讀一條數據命令,響應的報文中就只包含一條數據,此響應報文的Byte16<=8。 
Byte 04:DA=00 Byte 05:SA=02 即從02 PLC站發往PC。
Byte 16:數據塊佔位字節,從Byte21到校驗和前的字節數。
一條數據時:Word=06 Double Word=08 其它爲 05。
Byte 22:數據類型,位=3,其它=4。
Byte 24:數據寬度,Bit=01,Byte=08,Word=10H,Double Word=20H
Byte 25—28:值。
若是網絡上只可能有一個站會發迴響應報文,那麼能夠簡單的根據LE長度字節判斷返回值的位置:LE=16H,返回值是字節,或位類型的值,響應報文的Byte 25便是返回值;LE=17H,返回值是字(雙字節)類型的值,響應報文的Byte 25,26便是返回值;LE=19H,返回值是雙字(四字節)類型的值,響應報文的Byte 25—28便是返回值。更準確的方式是要根據返回報文的SA,DA,及存儲器位置等信息識別目標地址和源地址,確認是此次申請的返回數據,而後通過校驗檢查,獲得正確的數據。
一次讀出多條數據
若是用的是一次讀多條數據的命令,響應的報文中就包含有多條數據。這些數據只有類型參數,沒有偏移量參數,因此要注意根據讀命令的順序將其一一對應起來。
Byte 16:數據塊佔位字節,從Byte21到校驗和前的字節數,與數據塊數量和類型有關。
Byte 20:數據塊的個數。
Byte 21 開始爲數據塊,每個數據塊都以FF 04開始,接下來的兩個字節表示這一數據塊的長度,以位計算,而後依次是連續的數據。下一個數據塊也是以FF 04開始,重複上述格式,直到結束。

上位機與PLC通信時,上位機採用485芯片與PLC的編程口鏈接,,遵循PPI協議,主從式的通信方式,一次讀寫操做的步驟包括:首先上位機發出讀寫命令,PLC做出接收正確的響應(返回應答數據E5H),上位機接到此響應則發出確認命令(10 02 5C 5E 16),PLC完成正確的讀寫響應,返回給上位機相應數據。這樣收發兩次數據,完成一次數據的讀寫。那麼咱們就能夠利用上述PPI協議,讀寫S7-200PLC中的各類類型數據,包括I、Q、SM、M、V、S、T、C(T、C這兩種類型暫時尚未成功,正在查找緣由)等數據類型,可以直接讀出以上變量中的位、字節、字、雙字等,(其中讀位變量時,實際是讀取該位所在的字節值)。能夠改變PLC的運行狀態(RUN/STOP)。 在編程時,最好將讀取的檢測值、輸出值等數據,存放在PLC的一個連續的變量區中,當上位機讀取PLC的數據時,就能夠一次讀出這組連續的數據,減小數據的分次頻繁讀取。當修改設定值等數據時,進行寫數據的通信操做。
相關文章
相關標籤/搜索