시멘트#Modbus TCP 서버로 사용

11921 단어 PLCmodbusPython
이번에는 Siemens의 PLC에서 Modbus TCP 서버를 사용할 때의 절차를 설명합니다.
여기도 글↓가 있다.
http://soup01.com/ja/2019/12/24/post-1948/

TIA 버전



실제 버전



Function Block



그럼 먼저 F1로 헬프부터 보자.
이 MBSERVER 명령은 Modbus TCP 서버로 실행되며 Profinet 연결을 통해 Modbus TCP Celient와 연결, 발송, 통신, Modbus 요청 처리를 할 수 있습니다.

S7-1200

  • FirmwareV4.0에서 명령의 버전 V3입니다.1까지 사용할 수 있습니다.
  • FirmwareV4.1에서는 이 명령 버전을 모두 사용할 수 있습니다.
  • S7-1500

  • 이 명령 버전은 모두 사용할 수 있습니다.
  • !주의
    보안 측면에서, Modbus Client는 Modbus holdingregister의 모든 저장 영역을 읽고 쓸 수 있다.따라서 서버에 액세스할 수 있는 클라이언트의 IP 주소를 제한하는 것이 좋습니다.

    INPUT

  • DISCONNECT:Bool
  • 0: Passive Connection 설정
  • 1: Connection은 "TCON IP v4"를 기반으로 초기화됩니다.초기화에 성공하면 STATUS는 3으로 출력됩니다.
  • InOut


  • MB_HOLD_REG:Variant
  • 시엠엔스를 쓰는 사람들도 베리언트에 대해 잘 모르는 사람들이 많은데 나는 항상'무엇이든 다 있다'고 설명한다.결국 이 변수는 단순 볼일 수도 있고, 구조체일 수도 있고, 배열할 수도 있고, 무엇이든 변수로 처리할 수 있다는 것이다.
    이 펀션의 베리언트가 원하는 건 메모리아레야.Modbus Saber로 일하고 있기 때문에 당연히 Client에서 읽고 싶은 Memory Area가 있다.예를 들어 Parameter 등...
  • 참고:
  • 메모리 아레아 최저 2Byte죠.
  • Modbus Function 3, 6(쓰기), 16(멀티쓰기), 23(한 Job 멀티쓰기)만 액세스할 수 있습니다.

  • CONNECT:Variant
  • 이 CONNCT 매개변수에 사용되는 SDT(System Data Type)는 두 가지입니다.
  • TCON_IP_V4
  • 통신 성립에 필요한 네트워크 파라미터를 포함한다.Default 주소는 0.0.0.0입니다.당연히 절차상 변경할 수 있다.이 SDT를 사용하면 통신이 성립될 때'MB SERVER'라고 불린다.
  • TCON_Configured
  • 주소 매개 변수만 포함됩니다.이 SDT를 사용하면 통신을 달성하기 위해 CPU는 하드웨어 구성을 다운로드한 후
  • Output

  • NDR
  • “New Data Ready”
  • 0: 새로운 데이터가 오지 않았습니다.
  • 1: 새로운 데이터가 왔습니다(즉, Client에서 작성됨).
  • DR
  • “Data Read”
  • 0: 데이터가 읽히지 않았습니다.
  • 1: 데이터가 Celient에 로드됩니다.
  • ERROR
  • MB_SERVER 실행 시 A가 있으면 1입니다.그 오류 코드가 STATUS로 반환되었습니다.
  • STATUS
  • MB_SERVER의 실행 상태를 볼 수 있습니다.
  • TCON_IP_V4란 무엇인가?


    먼저 데이터 타입에서'TCON IP v4'를 입력하면 자동으로 변수가 생성된다.
  • InterfaceId
  • Modbus TCP/IP에 사용할 포트의 ID입니다.이번에는 S7-1200의 포트를 사용해야 하기 때문에 64입니다.
  • ID
  • 첫 번째 MBSERVER는 ID를 1로 설정합니다.CPU에 MB가 여러 개 있는 경우SERVER가 있다면 이 아이디를 쓰지 마세요.
  • ConnectionType
  • 11은 TCP/IP, 19는 UDP
  • ActiveEstablished
  • 이른바 Active 또는 Passive.이번에는 패스.
  • RemoteAddress
  • 길이 4의 Byte 배열.연결하려는 클라이언트의 IP를 설정할 수 있습니다.0.0.0.0이면 모든 클라이언트를 연결할 수 있습니다.
  • RemotePort
  • 이것은 상대방의 포트입니다.클라이언트에 특별한 포트 액세스 제한이 없다면 0이겠죠.
  • LocalPort
  • 자체 포트로 연결된 클라이언트와 감시 통신의 포트다.
  • 그렇다면 어느 정도 매개 변수를 파악했네요.

    이루어지다


    이런 구조(Variant)가 필요할 때 매개 변수가 그렇게 많지 않으면 항상 상세하게 분산된다.그러니까 그런 거야.제가 만든 클라스입니다.Modbus Server의 Function Block입니다.
    일반적으로 Input은 많은 부분을 가지고 있다고 생각하지만, 단순한 TCON을 잘 보았다면IP_V4 및 MBSERVER 변수만 있습니다.그리고 아웃풋은 MB.SERVER 출력만 있습니다.

    주의해야 할 건 IOMB입니다.HOLD_렉이지?여기에 놓인 것은 P#DB3입니다.DBX0.0.이 DB에는 51개의 인트가 있다.

    Input Interface



    Output Interface



    InOut Interface



    Static Interface



    Network3-10


    매개변수를 CONNEST 변수로 전달하기만 하면 됩니다.



    Network11


    MB_SERVER 호출이전에 Network 3-10으로 전달된 변수 CONNECT를 사용할 수 있습니다.

    Network13 


    DISCONNECT = 1이 매개변수를 초기화합니다.읽기 및 쓰기 카운터를 재설정합니다.

    Netowork14


    뭐, 클라이언트가 데이터를 읽으면 +1밖에 안 돼.

    Network15


    뭐, 단지 클라이언트를 데이터에 쓸 때 +1.

    Network17-20


    MB_SERVER의 실행 상태만 내보냅니다.


    수고하셨습니다!그렇게 말하고 싶지만 어렵기 때문에 여기서 파이톤으로 Modbus TCP Client를 만들어 방문해보자.

    Python Modbus TCP/IP 클라이언트


    사용할 OS 및 버전



    이루어지다

    #Library Import
    from pyModbusTCP.client import ModbusClient
    import time
    import random
    
    #Host,Port Settings
    SERVER_HOST='192.168.0.17'
    SERVER_PORT=502
    
    #Client
    client=ModbusClient()
    
    #Debug
    client.debug(False)
    
    #Config
    client.host(SERVER_HOST)
    client.port(SERVER_PORT)
    
    #Connect
    client.open()
    
    #Read and Write
    while True:
        if not client.is_open():
            if not client.open():
                print('Can not connect to {},{}'.format(SERVER_HOST,SERVER_PORT))
        if client.is_open():
            regs=client.read_holding_registers(0,10)
            if regs:
                print('data:'+str(regs))
            else:
                print('can not read.')
    
            reg_list=[random.randint(1,32000) for i in range(10)]
    
            regs=client.write_multiple_registers(0,reg_list)
    
            if regs:
                print('data is sent.')
    
            else:
                print('data can not sent')
        time.sleep(0.02)
    
    #Disconnect
    client.close()
    
    그럼, 수고하셨습니다!

    좋은 웹페이지 즐겨찾기