串口通信 校驗碼_一文讀懂S7-200 SMART自由口通信!

13ae22e45ebef1074fb6a7131c99ff04.png

學習S7-200 SMART時了解到,基于RS485接口可實現一下幾種通信:

1)modbus RTU通信

2)PPI協議通信

3)USS協議通信

4)自由口通信

何為自由口通信呢?

前三種通信必須要PLC和與其通信的設備支持相同的通信協議,如果兩者之間沒有共同的通信協議則需要用到自由口通信。自由口通信也稱無協議通信,需要根據對方設備的通信數據格式編寫一個臨時協議,不僅需要編程人員學會如何編寫程序,還需要了解對方的通信數據格式,所以對編程人員要求較高,隨著標準協議(modbus,USS等)普及,自由口應用越來越少,但是對于一下小的設備如掃碼槍等,并沒有集成標準通信協議,所以只能選用自由口通信,Moubus和USS其實是自由口的一個特例。很多人碰到自由口通信就手足無措了,其實只要掌握規律,自由口通信不一定很難。為此我總結了自由口通信的基本步驟:

1)讀懂對方的數據格式。

串行通信中,數據是一位一位的進行發送,也就是0和1。為了能夠準確的將數據發送過去,往往會加上1個起始位,1個校驗位,1個停止位(無校驗是為2個停止位)如圖1-1所示。

3cf4e53eb2b8392d70f332a21b07fcdf.png

圖1-1

我們就以Modbus RTU為例詳細看一下串口通信中數據是如何發送和就收的。

ModbusRTU代碼系統如下:

·1個起始位。

·7或8個數據位,最小的有效位先發送。

·1個奇偶校驗位,設成無校驗則沒有。

·1個停止位(有校驗時),2個Bit(無校驗時)。

數據格式的描述如下表:

11-bit字符幀(BITl-BIT8為數據位):

起始位

Bit1

Bit2

Bit3

Bit4

Bit5

Bit6

Bit7

Bit8

校驗位

停止位

10-bit字符幀(BITl-BIT7為數據位):

起始位

Bit1

Bit2

Bit3

Bit4

Bit5

Bit6

Bit7

校驗位

停止位

通信中要保證通信雙方要有相同的波特率,數據格式,奇偶校驗位。

波特率:通信速度,每秒中發送的位的個數,單位為Bit/S或bps。

奇偶檢驗:偶校驗的含義:在數據傳輸前附加一位偶校驗位,用來表示傳輸的數據中“1”的個數是奇數還是偶數,為偶數時,校驗位置為“0”,否則置為“1”用以保持數據的奇偶性不變。奇校驗的含義:在數據傳輸前附加一位奇校驗位,用來表示傳輸的數據中“1”的個數是奇數還是偶數,為奇數時,校驗位置為“0”,否則置為“1”用以保持數據的奇偶性不變。

一個字符幀中,真正起作用的是數據位。起始位、檢驗位和停止位的加入只是為了將數據位正確地傳輸到對方設備。在實際應用時一定要將主站和從站數據位、奇偶校驗、停止位設為一致。

在通信過程中一個完整的通信報文包括多個數據幀,一般包含地址幀、功能碼幀、數據幀、檢驗幀。在Modbus RTU中,一個報文發送完成之后會保持3.5個字節的靜默時間,再發送下一個報文,如圖1-2所示。

873536c315202513d30a19dc9e6de8b1.png

圖1-2

地址幀:指示從站的站號,以十六進制表示,如01H。

功能碼幀:指示操作是讀還是寫,03H為讀,06H為寫操作。

數據幀:包含要讀寫的從站參數起始地址、個數及數值,數據幀在發送的時候每個字包含兩個8位字符,先發高8位后發低8位。

校驗幀:CRC校驗值,也拆分成兩個字節,先發低字節后發高字節。校驗幀的原理是將將所有數據幀進行CRC運算,算出一個檢驗值,加在數據幀后面一起發送過去,從站設備接收到數據后再進行一次運算,將運算的檢驗值和接收的值進行比較,如果不一致則說明數據發送出錯。

例如:從01H號站變頻器,讀取從0004H地址開始的2個數據的值。

發送報文:01H(地址幀),03H(功能碼幀),00H(起始地址高位),04H(起始地址低位),00H(數據個數高位),02H(數據個數低位),85H(CRC低位),CAH(CRC高位)

例如:將5000(1388H)寫到從站地址02H變頻器的0004H地址中。

發送報文:02H,06H,00H,04H,13H,88H,C5H,6EH

了解了通信協議的數據格式,接下來就是編寫自由口通信程序:,下面就以通過自由口通信控制英威騰變頻器啟停為例講解程序的編寫。

歸納總結了一下分為以下幾步:

1)定義通信端口。

SMB30 和 SMB130 分別為端口 0 和 1 的控制字節,提供了波特率、奇偶校驗、數據位和通信協議的選擇,如圖1-3所示。

cd4f4e6e35e29956c1debba3bcf0d2c1.png

圖1-3

利用字節傳送指令將分析所得的控制字節數據寫入到SMB30或SMB130中,如圖1-4所示。

1ffd37149777d86d42c858a8a913299a.png

圖1-4

往SMB30中寫入2#01001001,則定義端口0為自由協議,波特率9600,8位數據位,偶校驗。

2)按照發送指令XMT的緩沖區格式定義發送數據報文。

fbdcb630782db5151639dc5948dbae45.png

圖1-5

圖1-5中TBL(VB0)為發送緩沖區起始地址,格式為:

VB0:發送字節總數。

VB1:報文第一幀,即地址幀,16#01

VB2:功能碼幀,寫16#06。

VB3:通信地址高位,控制啟停地址為16#2000,高位為16#20。

VB4:通信地址低位,16#00。

VB5:寫入數值高位,16#00(寫入16#0001正轉,16#0002反轉,16#0005停止)。

VB6:寫入數值低位,16#01。

VB7:CRC校驗碼低位,16#43。

VB8:CRC校驗碼高位,16#CA。(校驗碼為16#CA43)

程序如圖1-6所示,此處用到一個CRC算法程序,

a4ff651b12dc79e84ba1b54b36bc3a2d.png

圖1-6

3)觸發發送指令XMT,如圖1-7所示。

53b1b8bbea574d7fd5a09edc2379e5bf.png

圖1-7

3)接收數據,接收有兩種方式,一是利用RCV指令接收,應用較為復雜,此處不介紹;一是利用SMB2緩沖地址接收,因為端口0接收到一個字符會觸發8號中斷,并將其存放于SMB2中,通常利用8號事件觸發中斷,在中斷中將SMB2的數據轉存到其它地址,否則下一數據將覆蓋該數據,直到接收完所有數據后置位一個完成標志,延時一定事件再次觸發發送指令。接收中斷程序如圖1-8所示。

1983603ef2254b1bab4becb52f2b699a.png

圖1-8

以上介紹了S7-200SMART的自由口通信,使用自由口通信時編寫程并不是難點,關鍵在于讀懂對方通信數據格式,在以后編程過程中盡量選用支持標準協議的設備,確實需要選用自由口也不用害怕,只要按照上述步驟一步步來完成,相信肯定可以通信成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542607.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hbase 學習(十三)集群間備份原理

集群建備份,它是master/slaves結構式的備份,由master推送,這樣更容易跟蹤現在備份到哪里了,況且region server是都有自己的WAL 和HLog日志,它就像mysql的主從備份結構一樣,只有一個日志來跟蹤。一個master集…

python expect模塊_Python基礎教程:用Python怎么telnet到網絡設備

Python基礎教程:用Python怎么telnet到網絡設備0.前言Telnet協議屬于TCP/IP協議族里的一種,對于我們這些網絡攻城獅來說,再熟悉不過了,常用于遠程登陸到網絡設備進行操作,但是,它的缺陷太明顯了,…

Java實現動態加載頁面_[Java教程]動態加載頁面數據的小工具 javascript + jQuery (持續更新)...

[Java教程]動態加載頁面數據的小工具 javascript jQuery (持續更新)0 2014-05-07 18:00:06使用該控件,可以根據url,參數,加載html記錄模板(包含json參數對應,以及具體記錄位置Index根據參數描述加載對應的屬性,并可以…

馬哥linux第六周作業

1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;[rootmageedu tmp]# cp /etc/rc.d/rc.sysinit . [rootmageedu tmp]# vim rc.sysinit :% s/^[[:space:]]/#&/ #按Esc進入vi…

Java ObjectInputStream enableResolveObject()方法與示例

ObjectInputStream類enableResolveObject()方法 (ObjectInputStream Class enableResolveObject() method) enableResolveObject() method is available in java.io package. enableResolveObject()方法在java.io包中可用。 enableResolveObject() method is used to enable th…

pygame render怎么顯示中文_PyGame開發游戲(2D)02.基礎圖元

這節將介紹PyGame的基礎架構。并學習如何在PyGame里繪制各種幾何圖形和顯示加載圖片。01.應用框架上一節的示例程序里,我們用到一個PyGame的應用程序框架。這是一個基礎框架,利用它我們可以很輕松的添加各類圖型繪制,鍵盤鼠標輸入處理和各類邏…

word+增加水印+java_為Word2019文檔添加水印的兩種方法

水印的類型包括文字水印和圖片水印兩種。在Word文檔中添加文字水印時,可以使用程序中預設的水印效果,而圖片水印則需要自定義添加。一、使用程序預設的文字水印Word 2019中預設了機密、緊急、免責聲明三種類型的文字水印,用戶可根據文件的類型…

如何設置CentOS 7獲取動態及靜態IP地址

自動獲取動態IP地址1.輸入“ip addr”并按回車鍵確定,發現無法獲取IP(CentOS 7默認沒有ifconfig命令),記錄下網卡名稱(本例中為ens33)。2.輸入“cd /etc/sysconfig/network-scripts/”按回車鍵確定,繼續輸入“ls”按回…

請求列出指定服務器上的可用功能失敗_濫用 ESI 詳解(上)

在進行安全性評估時,我們注意到了標記語言 Edge Side Includes (ESI)中的一個意外行為,這種語言用于許多流行的 HTTP 代理(反向代理、負載平衡器、緩存服務器、代理服務器)。我們發現成功的 ESI 攻擊可以導致服務器端請求偽造(SSRF)、各種繞過 HTTPOnly …

Java ClassLoader setPackageAssertionStatus()方法與示例

ClassLoader類setPackageAssertionStatus()方法 (ClassLoader Class setPackageAssertionStatus() method) setPackageAssertionStatus() method is available in java.lang package. setPackageAssertionStatus()方法在java.lang包中可用。 setPackageAssertionStatus() metho…

java上傳kafka的方法_哪種方法是將所有數據從Kafka主題復制到接收器(文件或Hive表)的最佳方法?...

我正在使用Kafka Consumer API將所有數據從Kafka主題復制到Hive表 . 為此,我使用HDFS作為中間步驟 . 我使用唯一的組ID并將偏移重置為“最早”,以便從頭開始獲取所有數據,并在執行后忽略提交 . 然后我遍歷Kafka主題中的記錄,并將每…

openstack nova-network 的小bug的排錯經歷

環境是 nova-network vmwareflatdhcp錯誤表現為 開出來的虛擬機有一定幾率獲取不到dhcp地址,手工賦予ip則正常,用flat模式注入的ip正常,下面是排錯過程1首先找網絡防火墻已經把 dnsmasq對應的端口已經打開抓包結果:可以看到虛擬機…

anaconda base環境_anaconda中安裝packages:pip還是conda install?

conda install我就不說了,這都不會別學了就。Using command:$ which -a pip, the terminal will return:This indicates two different pip path to install packages[1].在tf23環境中pip install在base環境中pip install在windows下powershell內,進入到…

Java ClassLoader setDefaultAssertionStatus()方法與示例

ClassLoader類setDefaultAssertionStatus()方法 (ClassLoader Class setDefaultAssertionStatus() method) setDefaultAssertionStatus() method is available in java.lang package. setDefaultAssertionStatus()方法在java.lang包中可用。 setDefaultAssertionStatus() metho…

【風馬一族_xml】xmlp之dtd1

什么是XML約束?在xml技術里,可以編寫一個文檔來約束一個xml文檔的寫法,這稱之為xml約束 2. 為什么要使用xml約束? 參看提示欄 3. xml約束的作用? 約束xml的寫法對xml進行校驗4. 常見的xml約束技術 xml dtdxml Schema…

java ssm框架 緩存_SSM框架之MyBatis3專題4:查詢緩存

查詢緩存的使用,主要是為了提高查詢訪問速度。將用戶對同一數據的重復查詢過程簡化,不再每次均從數據庫中查詢獲取結果數據,從而提高訪問速度。MyBatis的查詢緩存機制,根據緩存區的作用域(聲明周期)可劃分為兩種:一級查…

matplotlib畫圖_漂亮,超詳細的matplotlib畫圖基礎

來自 | 逐夢erhttps://zhumenger.blog.csdn.net/article/details/106530281本文僅作技術交流,如有侵權,請聯系后臺刪除。數據可視化非常重要,因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。matplotlib 庫是專門用于開發…

c# 2維數組 取一維_C#| 不同類型的一維數組聲明

c# 2維數組 取一維In the below example, we are declaring an integer array (one dimensional) with following styles: 在下面的示例中,我們聲明具有以下樣式的整數數組(一維) : 1) One dimensional Array declaration with initialization (without…

Java編程經典10道_Java經典編程題50道之十二

企業發放的獎金根據利潤提成:利潤(I)低于或等于10萬元時,獎金可提10%;利潤高于10萬元,低于20萬元時,低于10萬元的部分按10%提成, 高于10萬元的部分 ,可提成7.5%;20萬到40萬之間時&am…

RHEL7 單獨安裝圖形 X11

RHEL7 默認是最小化安裝(Minimal Install),沒有圖形界面, 我們應該選擇Server with GUI。若已錯過此步驟,我們采用以下方式補充安裝GUI界面。 先配置yum源可以參考我的這篇文章http://blog.itpub.net/27771627/viewspa…