新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于調制解調器與VB的PLC遠程通訊系統設計

        基于調制解調器與VB的PLC遠程通訊系統設計

        作者: 時間:2016-12-19 來源:網絡 收藏

        4 PC端程序設計

        4.1 撥號程序設計

        PC端將以VB6.0所帶的通信控件MSCOMM進行通信軟件的開發,利用該控件控制串口實現對MODEM的控制。控制步驟如下:

        一.通信參數設置

        設置串口端口號,波特率,數據位,停止位,奇偶校驗位及設置硬件握手協議,然后向MODEM發出DTR(已準備好)信號一便接管MODEM,程序如下:

        If MSComm1.PortOpen Then

        MSComm1.DTREnable = True

        Else

        MSComm1.DTREnable = False

        End If

        二.對MODEM初始化

        發出一些命令來設置參數,其中S0=n(n>=1)自動應答.n為響鈴次數;E0/E1關閉/打開命令字符回應;Q0/Q1設置MODEM返回/不返回結果碼;M0/M1關閉/打開MODEM揚聲器;Ln(n>=0)設置MODEM揚聲器音量;P/T設置MODEM脈沖/音頻撥號;程序如下:

        If MSComm1.PortOpen Then

        Do While Not MSComm1.CTSHolding: Loop

        TXD= "ATS0=1E1Q0M1L2T" + Chr(13)

        MSComm1.Output = TXD

        End If

        三.進行撥號

        向MODEM發出ATD命令,程序如下:

        MSComm1.Output="ATD" & "05925998499"+Chr(13)

        當發送“ATD”+ 電話號碼 + Chr(13)時,MODEM就開始撥號,撥號需要一定的時間,在撥號的過程中可以不斷讀取MODEM的CD指示燈的狀態,當電話撥通后CD指示燈會點亮。并返回“CONNECT + 波特率”的信息。如果MODEM向PC的回應字符串中含有"Connect"或CDHolding屬性值變為True(檢測出載波),則表示已與遠方MODEM連機了,此時可以傳輸數據。

        當電話撥通后,MODEM不再接收AT指令,要使其回到命令狀態,則必須發送“+++”信息,使MODEM回到命令狀態,然后發送“ATH”+ Chr(13)則可以掛斷電話,程序如下:

        MSComm1.Output="ATH" +Chr(13)

        4.2 通訊程序設計

        一.永宏PLC通訊協議

        ⑴.開頭字符(STX):ASCI I碼之開始字符STX。

        ⑵.從站號碼:為兩位數之16進制數值。

        ⑶.命令號碼:為兩位數之16 進制數值,為由主系統要求從系統所執行之動作類別。

        ⑷.本文資料:本文數據可為0(無本文數據)~500個ASCII字符。

        ⑸.偵誤值(CHECKSUM): 偵誤值系將前述~將各ASCII字符之16進制數碼值(8位長度)從頭至尾依序相加,但不考慮進位,因此最終結果為偵誤值。

        ⑹.結尾字符(ETX):ASCI I碼之結尾字符ETX之16進制數碼為03H。。

        二.讀數寫數

        本系統操作PLC的關鍵數據主要是水位的設定值PV=R0和當前值CV=R1,即要對暫存器R0進行寫操作,R1進行讀操作;

        依照協議VB設計的通訊程序必須指定一個命令碼,向PLC請求數據讀取,查的該命令碼為“46”,解釋為:連續多個緩存器之數據讀取。讀取R1的PC命令的ASCII碼寫法為:

        “STX+ 01(站號)+46(命令碼)+01(連續數據個數)+R00001(數據開始地址)+LRC(偵誤值)+ETX”

        依照協議VB設計的通訊程序必須指定一個命令碼,對PLC緩存器數據寫入,查的該命令碼為“47”,解釋為:連續多個緩存器之數據寫入。寫入R0的PC命令的ASCII碼寫法為:

        “STX+ 01(站號)+47(命令碼)+01(連續數據個數)+R00000(數據開始地址)+XXXX(寫入的數據資料,16進制)+LRC(偵誤值)+ETX”

        讀取當前值CV=R1,程序如下

        Private Sub Timer1_Timer()

        MSComm1.Output= Chr(2)+ “014601R00001”+ Lrc(“014601R00001”)+Chr(3)

        Delay (10) //延時

        CV = Val("&H" + Mid(MSComm1.Input, 7, 4)) //數據處理,R0放于CV

        CV.Text = CV

        End Sub

        寫入設定值PV=R0,程序如下

        Private Sub Command1_Click()

        If Len(Hex(PV.Text)) = 4 Then PV = Hex(PV.Text)

        If Len(Hex(PV.Text)) = 3 Then PV = "0" + Hex(PV.Text

        If Len(Hex(PV.Text)) = 2 Then PV = "00" + Hex(PV.Text)

        If Len(Hex(PV.Text)) = 1 Then PV = "000" + Hex(PV.Text) //10進制轉換16進制

        MSComm1.Output=Chr(2)+ “014701R00000”+ PV + +Lrc(“014701R00000” & PV)+Chr(3)

        End Sub

        三.偵誤值(CHECKSUM)計算

        為VB的編程方便,把該計算做成單獨一個子程序,依所有數據累加,舍棄進位的規則VB的LRC編程如下:

        Private Function Lrc(Dats) As String

        Dim i

        Dim Sum

        Sum =2

        For i = 1 To Len(Dats)

        Sum = Sum + Asc(Mid(Dats, i, 1))

        Next i

        Lrc = Right("0" + Hex(Sum + 2), 2)

        End Function

        5結束語

        采用基于MODEM通訊的設計極方便地實現該小電站生廠調度,在這種只需短時間連接控制的系統應用上可以大幅度地減小通訊成本,具有一定的推廣價值。另外,通過MODEM的連接,利用永宏編程軟件可以實現該設備的遠程程序調試修改,通過兩個MODEM還可以實現兩臺遠程PLC的CPU連接通訊等。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 昌宁县| 镇坪县| 汕尾市| 西丰县| 龙井市| 泰州市| 乌拉特前旗| 沂水县| 武宁县| 嘉鱼县| 古交市| 舞阳县| 安西县| 泽库县| 湖州市| 马关县| 岫岩| 长宁区| 扬中市| 中阳县| 沂南县| 泰来县| 三门县| 巴林左旗| 双鸭山市| 洮南市| 航空| 中江县| 依安县| 南郑县| 莒南县| 芒康县| 龙岩市| 夏河县| 广宁县| 囊谦县| 百色市| 清远市| 屏东县| 苏尼特左旗| 元朗区|