2017-11-06 48 views
0

내가 읽고 다음과 같은 매개 변수를 사용하여 장치에서 레지스터를 쓰고 있어요 (최소 모드 버스 사용) null을 반환 전송 속도 - 9600 stopbit-1 no_of_bits - 8 패리티 - 홀수모드 버스 읽기는 성공하지만, 모드 버스 쓰기

현재 최소한의 modbus 라이브러리를 사용 중입니다. 레지스터를 읽어 내 코드

# serial line 
    import traceback 
    import minimalmodbus as mmRtu 

    regsSp = 6 
    portName = 'com4' 
    baudrate = 9600 

    timeoutSp = 0.5 + regsSp * 0 
    mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU) 
    mmc.serial.baudrate = baudrate 
    mmc.serial.timeout = timeoutSp 
    mmc.serial.parity = 'O' 

    tb = None 
    errCnt = 0 
    mmc.address = 5 
    try: 
     data = mmc.read_registers(3, 6) 
    except: 
     tb = traceback.format_exc() 
     errCnt += 1 
    mmc.serial.close() 
    print(errCnt) 
    print(data) 

아래에 붙여 읽기 레지스터가 완벽하게 작동하고

[스레드 Python modbus library 참조].

그러나 여기에서는 내 write_register가 실패합니다. 내 장치의 다섯 번째 레지스터에서 읽는 중입니다. 코드는 다음과 같습니다. mmc.write_register (4, 5, 0, 6, 17 행,

# serial line 
    import traceback 
    import minimalmodbus as mmRtu 

    regsSp = 6 
    portName = 'com4' 
    baudrate = 9600 

    timeoutSp = 0.5 + regsSp * 0 
    mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU) 
    mmc.serial.baudrate = baudrate 
    mmc.serial.timeout = timeoutSp 
    mmc.serial.parity = 'O' 

    tb = None 
    errCnt = 0 
    mmc.address = 5 
    try: 
     data = mmc.read_registers(3, 6) 
    except: 
     tb = traceback.format_exc() 
     errCnt += 1 
    mmc.serial.close() 
    print(errCnt) 
    print(data) 

역 추적 (마지막으로 가장 최근 통화) : 파일 "/Users/Admin/PycharmProjects/weight_calibrate/weight_calibrate.py C" , False) 파일 "write_register 에서 C : \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py"파일 296 줄 self._genericCommand (functioncode, registeraddress, value, numberOfDecimals, signed = signed) 파일 "C : \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6. egg \ minimalmodbus.py ", 줄 697, _genericCommand에서 payloadFromSlave = self._perfo rmCommand (functioncode, payloadToSlave) "C : \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py"파일의 795 행에 있습니다. in _performCommand 파일 "C : \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus"응답이 self._communicate (요청, number_of_bytes_to_read) 이 IO 오류 ('기기와 통신 할 수없는 경우 (응답 없음)') OSError를 제기 _communicate에 평 ", 라인 (930) : 기기와 통신 할 수없는 경우 (응답 없음)이

내가 체크 한 그의 데이터 패킷 요청은 완벽합니다. 심지어 CRC입니다. 그러나 장치의 응답은 null이며 코드가 실패하는 곳입니다.

minimalmodbus.py

if len(answer) == 0: 
     raise IOError('No communication with the instrument (no answer)') 

대답은 'B' '나는 단순히 모드 버스 도구 마스터 8.0.7 및 요청 데이터 패킷이를 사용하여 장치의 레지스터에 쓸 수 있어요

이기 때문에 두 경우 모두 같은 내용. 이것은 포트에 쓸 수있는 권한이 있음을 의미합니다. 또한 읽은 후에도 포트에 요청을 실제로 기록하기 때문에 파일 사용 권한이 문제가되지 않을 수도 있습니다.

내가 여기에 어떤 설정을 잃었 경우 제안하시기 바랍니다

..

또한 라이브러리 modbus_tk을 시도하고도 그 경우에 실패합니다.

답변

0

나는이 라이브러리를 사용한 적이 있지만, 그것은 당신이 다음과 같은 방식으로 write_register 함수를 호출되어 나타납니다

write_register(4, 5, 0, 6, False) 

문서는 첫 번째 숫자는 이후의 모든 번호가있는 주소 및 제안 값은 지정된 주소에서 시작하여 기록됩니다. 아직 작성하지 않았다면 '거짓'을 삭제하고 글쓰기가 제대로 진행되는지 확인하십시오.