女人被爽到高潮视频免cn费95,久久99精品久久久久久久不卡,内射人妻骚骚骚,久久精品一区二区三区四区啪啪 ,美女视频黄频a美女大全

  • 正文
    • 三、關于MC協議的整體實現
  • 相關推薦
申請入駐 產業(yè)圖譜

python實現MC協議(SLMP 3E幀)的TCP服務端(篇二)

2024/12/08
2323
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

python實現MC協議(SLMP 3E幀)的TCP服務端是一件稍微麻煩點的事情。它不像modbusTCP那樣,可以使用現成的pymodbus模塊去實現。但是,我們可以根據協議幀進行組包,自己去實現幀的格式,而這一切可以基于socket模塊。本文為第二篇。

二、讀寫保持寄存器的完整交互包

# 客戶端發(fā)送(讀) -》
50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 00 00 00 A8 05 00
# 《- 服務端應答
D0 00 00 FF FF 03 00 0C 00 00 00 73 00 00 00 00 00 00 00 00 00
# 客戶端發(fā)送(寫) -》
50 00 00 FF FF 03 00 16 00 10 00 01 14 00 00 0A 00 00 A8 05 00 4E 47 00 00 00 00 00 00 00 00
# 《- 服務端應答
D0 00 00 FF FF 03 00 02 00 00 00

1、分析交互包

基于上述交互包,我們查閱官方文檔發(fā)現交互包使用的是二進制代碼。那么,二進制代碼與ASCII代碼有什么區(qū)別呢?

SLMP(Seamless Message Protocol)3E幀有兩種表示方式:二進制格式和ASCII格式。它們的區(qū)別在于數據的傳輸方式和呈現形式。

(1)二進制格式

在二進制格式中,SLMP 3E幀中的各個字段(如幀頭、副幀頭、命令碼、數據等)以二進制形式直接編碼和傳輸。數據在網絡中以原始的二進制位模式傳輸,這種方式效率較高,適用于網絡傳輸。二進制格式通常用于實際的網絡通信中,數據以二進制流的形式在網絡上傳輸。

(2)ASCII格式

在ASCII格式中,SLMP 3E幀中的各個字段被轉換成ASCII字符表示。數據以ASCII碼的文本形式進行傳輸,每個字節(jié)被轉換為兩個ASCII字符(通常是十六進制表示)。ASCII格式通常用于調試和人機界面中,方便人們查看和理解數據。

總的來說,二進制格式適用于機器之間的網絡通信,而ASCII格式適用于人機交互和調試過程中的數據顯示。選擇哪種格式取決于具體的應用場景和需求。

因此,本文實現的是二進制格式,如果你會實現二進制格式,那么你也能實現ASCII格式。

2、讀寫保持寄存器的請求處理

(1)表頭

客戶端的兩個請求,相同部分都為50 00 00 FF FF 03 00,我們姑且稱之為表頭。

(2)讀/寫長度(協議幀的長度)

0C 00是固定長度(讀的時候報文都是這么長)與16 00 根據實際長度變化,表示后面數據的長度,例如前者,應該以00 0C來看長度,表示后面有12個00那樣的長度。

(3)固定值

10 00

(4)讀/寫指令

01 04 / 01 14

(5)讀/寫寄存器地址

00 00 00 00 00 A8 05 00 /??00 00 0A 00 00 A8 05 00,其中寫的0A 00代表從第10個保持寄存器,05表示讀寫5個寄存器

3、讀寫保持寄存器的響應處理

(1)表頭

客戶端的兩個請求,相同部分都為D0 00 00 FF FF 03 00,我們姑且稱之為表頭。

(2)長度(協議幀的長度)

讀:0C 00根據實際長度變化,寫:02 00 可以不變化。

(3)固定值

00 00

(4)讀/寫響應

響應實際讀到的數據?/ 無

4、程序設計

根據上述內容,實現了一個定制MC服務器,能夠處理保持寄存器的讀寫請求,給出正確的響應。

import socket
import struct

# 創(chuàng)建一個TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定套接字到特定地址和端口
server_address = ('192.168.1.188', 12345)  # 服務器地址和端口
server_socket.bind(server_address)

# 監(jiān)聽連接
server_socket.listen(1)

print('等待客戶端連接...')
connection, client_address = server_socket.accept()

print('客戶端已連接:', client_address)

def request_verdict(req_bytes_frame):  # req_bytes_frame是字節(jié)數據b'x02x00x08x00x00x00x00x00x10x00x01x01x02x03x04x03'
    command = req_bytes_frame.hex()[22:26]  # 轉成16進制字符串好數據處理
    if command in ["0104", "0401"]:  # 判斷讀寫
        return False # 讀
    elif command in ["0114", "1401"]:
        return True  # 寫
    else:
        raise ValueError("讀寫指令錯誤!")

def write_response_frame(req_bytes_frame):
    response = "D00000FFFF030002000000"  # 寫成功則返回這一串數據
    content = req_bytes_frame.hex()[42:]  # 看一下客戶端想寫的內容
    print("客戶端想要寫入的內容:", bytes.fromhex(content).decode())
    return bytes().fromhex(response)

def read_response_frame(req_bytes_frame, res_data):
    header = "D00000FFFF03000C000000"  # 讀的響應頭
    nums = req_bytes_frame.hex()[38:42]  # 獲取客戶端想要讀的寄存器個數
    act_nums_hex = nums[2:] + nums[:2]  # 涉及大端序和小端序,需要轉一下
    act_nums = int(act_nums_hex, 16)  # 得到實際數量
    res_data_hex = ''.join([hex(ord(c))[2:].zfill(2) for c in res_data])  # 將要返回的數據轉成16進制字符串
    response = header + res_data_hex + '0'*(act_nums*2*2-len(res_data_hex))  # 根據請求數量返回對應的內容
    return bytes().fromhex(response)

try:
    while True:
        # 接收客戶端請求
        request = connection.recv(1024)
        print("001:", request)
        if request:
            flag = request_verdict(request)
            if flag:  # 響應寫
                response = write_response_frame(request)
                print("002:",response)
            else:  # 響應讀
                response = read_response_frame(request, "start")
                print("003:",response)
            connection.sendall(response)
finally:
    # 清理連接
    connection.close()

三、關于MC協議的整體實現

通過“二”,我們實現了一個基于MC協議的保持寄存器的讀寫服務器,但并沒有像pymodbus這種現成模塊那樣完整實現,這里探討一下還可以做的事。

1、SLMP 3E幀實現步驟

實現SLMP(Seamless Message Protocol) 3E幀協議涉及到網絡通信、數據處理、錯誤處理等多個步驟。以下是實現SLMP 3E幀的一般步驟:

(1)建立TCP連接:

在服務端,監(jiān)聽指定端口(通常是4999)。
在客戶端,連接到服務端的IP地址和端口。
(2)接收請求:

服務端接收客戶端發(fā)送的SLMP 3E幀請求。
解析SLMP 3E幀,獲取命令碼、子命令碼、數據等信息。
(3)處理請求:

根據SLMP 3E幀中的命令碼和數據,執(zhí)行相應的操作,如讀取、寫入、控制等。
處理請求可能涉及到對PLC或其他設備進行讀寫操作,具體實現根據設備和應用需求而定。
(4)生成響應:

根據請求處理的結果,生成SLMP 3E幀的響應數據。
設置響應幀的命令碼、子命令碼、數據等。
(5)發(fā)送響應:

將生成的SLMP 3E幀響應數據發(fā)送回客戶端。
(6)錯誤處理:

在處理請求和生成響應的過程中,可能出現各種錯誤,如無效命令、數據不合法等。
針對不同的錯誤情況,生成相應的錯誤響應幀。
(7)關閉連接:

當通信結束或出現錯誤時,關閉TCP連接,釋放資源。
請注意,SLMP 3E幀協議具體的實現步驟和數據格式可能因具體設備和應用而有所不同。在實際開發(fā)中,需要參考設備文檔和SLMP協議規(guī)范來進行具體的實現。

2、SLMP協議規(guī)范

查閱三菱PLC關于SLMP的文檔!

SLMP的詳細規(guī)范通常由設備廠商提供,以便開發(fā)者能夠正確地使用該協議與設備進行通信。規(guī)范文件通常包含SLMP協議的命令碼、數據格式、通信流程、錯誤處理等方面的詳細信息。

3、為什么會有SLMP協議

SLMP(Seamless Message Protocol)協議是為了在自動化領域(例如工業(yè)自動化、制造業(yè)、機器人技術等)中實現設備之間的無縫通信而設計的。它提供了一種標準化的通信協議,使不同廠商、不同類型的設備能夠在同一個網絡上進行通信,實現設備的互聯互通。

在現代工業(yè)自動化系統(tǒng)中,通常涉及到各種各樣的設備,這些設備由不同的廠商制造,可能使用不同的通信協議和數據格式。為了實現這些設備之間的互聯互通,需要一種通用的、標準化的通信協議。SLMP就是為了滿足這種需求而被開發(fā)出來的。

SLMP協議的設計目標包括:

標準化通信: 提供一種通用的通信協議,使得不同廠商生產的設備可以在同一個網絡上進行通信。

靈活性: 允許不同類型的數據(例如狀態(tài)信息、控制命令等)通過同一個協議進行傳輸。

高效性: 設計為高效的通信協議,以滿足工業(yè)自動化系統(tǒng)對實時性和響應速度的要求。

易用性: 設計為易于實現和配置,使得工程師能夠方便地將SLMP協議集成到他們的設備和系統(tǒng)中。

綜上所述,SLMP協議的存在使得不同類型的自動化設備能夠方便地相互通信,實現了工業(yè)自動化系統(tǒng)的互操作性和靈活性。

4、我是否可以自定義一套協議

你完全可以自定義一套通信協議,以滿足特定需求或者應用場景。自定義通信協議通常涉及到以下幾個步驟:

確定通信需求: 首先,你需要明確通信雙方之間需要傳輸哪些數據,以及數據的格式和類型。確定通信的數據結構、命令類型、錯誤處理機制等。

選擇傳輸方式: 確定通信采用的傳輸方式,可以是基于串口的通信(例如RS-232、RS-485)、基于網絡的通信(例如TCP/IP、UDP)、無線通信(例如Wi-Fi、藍牙)等。

制定協議規(guī)范: 定義協議的數據幀格式,包括幀頭、幀尾、校驗碼等信息。確保通信雙方遵循相同的協議規(guī)范。

實現協議解析和封裝 在通信的發(fā)送端和接收端分別實現協議的封裝和解析邏輯。封裝就是將待發(fā)送的數據按照協議格式組織成數據幀,解析則是在接收端將接收到的數據幀按照協議格式解析成可處理的數據。

添加錯誤處理和安全性: 考慮數據傳輸中可能出現的錯誤情況,設計相應的錯誤處理機制,確保數據的完整性和可靠性。如果通信需要保密性,可以考慮加密通信數據。

測試和驗證: 在實際環(huán)境中進行測試和驗證,確保自定義協議能夠正常工作,并且滿足通信需求。

請注意,自定義協議需要考慮通信的穩(wěn)定性、可靠性和安全性。在設計過程中,建議參考現有通信協議的設計經驗,以及相關領域的最佳實踐。同時,文檔化自定義協議的規(guī)范,以便未來的維護和擴展。

相關推薦