diff --git a/.config.json.un~ b/.config.json.un~ new file mode 100644 index 0000000..b43e561 Binary files /dev/null and b/.config.json.un~ differ diff --git a/.framework.yaml.un~ b/.framework.yaml.un~ new file mode 100644 index 0000000..78fe847 Binary files /dev/null and b/.framework.yaml.un~ differ diff --git a/.main.py.un~ b/.main.py.un~ new file mode 100644 index 0000000..af1130a Binary files /dev/null and b/.main.py.un~ differ diff --git a/.requirements.txt.un~ b/.requirements.txt.un~ new file mode 100644 index 0000000..8b022ce Binary files /dev/null and b/.requirements.txt.un~ differ diff --git a/README.md b/README.md index dce3e2a..20e6c43 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,30 @@ -# sampyo-rs232 +# 이 코드 템플릿은 SDT Cloud 환경에서 mqtt 메세지를 발행하는 코드입니다. -Your repository description \ No newline at end of file +# 패키지 설치 +- 코드는 sdtcloudpubsub 패키지를 사용합니다. 아래 명령어로 패키지를 다운로드 해야합니다. +```bash +$ pip install sdtcloudpubsub +``` + +# 코드 작성 +- 코드는 runAction 함수에서 동작하고자 하는 기능을 작성합니다. +- msg 변수는 발행될 메세지 입니다. +- sdtcloudpubsub의 pubMessage 함수는 발행할 메세지 내용인 dictionary 타입 변수를 입력 받아 처리합니다. + +# 메세지 발행 +- 다음 변수로 메세지를 발행하는 코드를 작성하면... +```bash +msg = { + "message": "Hello World" +} +``` +- 실제로 발행되는 메세지은 다음과 같습니다. +```bash +msg = { + "data": { + "message": "Hello World" + }, + "timestamp": 12312311... +} + +``` diff --git a/config.json b/config.json new file mode 100644 index 0000000..50d3a30 --- /dev/null +++ b/config.json @@ -0,0 +1,6 @@ +{ + "modbus-server": { + "address": "25.7.55.237", + "port": 5020 + } +} diff --git a/framework.yaml b/framework.yaml new file mode 100644 index 0000000..58b6d26 --- /dev/null +++ b/framework.yaml @@ -0,0 +1,11 @@ +version: bwc/v2 # bwc 버전 정보입니다. +spec: + appName: sampyo-rs232-app # 앱의 이름입니다. + runFile: main.py # 앱의 실행 파일입니다. + env: + bin: python3 # 앱을 실행할 바이너라 파일 종류입니다.(장비에 따라 다르므로 확인 후 정의해야 합니다.) + virtualEnv: base # 사용할 가상환경 이름입니다. + package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.) +stackbase: + tagName: v0.0.1 # Stackbase(gitea)에 릴리즈 태그명 입니다. + repoName: sampyo-rs232 # Stackbase(gitea)에 저장될 저장소 이릅니다. diff --git a/framework.yaml~ b/framework.yaml~ new file mode 100644 index 0000000..4b3c1f2 --- /dev/null +++ b/framework.yaml~ @@ -0,0 +1,11 @@ +version: bwc/v2 # bwc 버전 정보입니다. +spec: + appName: base-app # 앱의 이름입니다. + runFile: main.py # 앱의 실행 파일입니다. + env: + bin: python3 # 앱을 실행할 바이너라 파일 종류입니다.(장비에 따라 다르므로 확인 후 정의해야 합니다.) + virtualEnv: base # 사용할 가상환경 이름입니다. + package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.) +stackbase: + tagName: v0.0.1 # Stackbase(gitea)에 릴리즈 태그명 입니다. + repoName: base-template # Stackbase(gitea)에 저장될 저장소 이릅니다. diff --git a/main.py b/main.py new file mode 100644 index 0000000..4593afe --- /dev/null +++ b/main.py @@ -0,0 +1,102 @@ +import signal, sys, time, os +import serial +import asyncio +from pymodbus.server.async_io import ModbusTcpServer +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +import argparse + +async def measurement_weight(port, data): + command_hex = '4430314B570D0A' + command_bytes = bytes.fromhex(command_hex) + + while True: + try: + port.write(command_bytes) + time.sleep(0.02) + result = port.readline() + result = str(result, 'utf-8') + result = result.replace(' ', '') + result = float(result.replace('\r\n', '')) + result *= 1000 + + print(result) + + if result < 0.0: + result = 0.0 + + data.setValues(3, 1, [int(result)]) + except Exception as e: + print(f'measurement_weight: \n{e}') + pass + + await asyncio.sleep(1) + +async def set_zero(port, data): + command_hex = '4430314B5A0D0A' + command_bytes = bytes.fromhex(command_hex) + + while True: + try: + val = data.getValues(1, 1, count=1) + + if val[0] == 1: + port.write(command_bytes) + result = port.readline() + data.setValues(1, 1, [0]) + else: + print(f'set_zero: \n{e}') + pass + except: + pass + + await asyncio.sleep(1) + +def exit_handler(signum, frame): + print('Stop') + sys.exit(0) + +async def run_server(port, data): + # TCP 서버 시작 + server = ModbusTcpServer(context, address=("25.7.55.237", 5020)) + + update_coil_task = asyncio.create_task(measurement_weight(port=port, data=data)) + update_hr_task = asyncio.create_task(set_zero(port=port, data=data)) + + await server.serve_forever() + await asyncio.gather(update_coil_task, update_hr_task) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-app',help='') + args = parser.parse_args() + + ROOT_PATH = f'/usr/local/sdt/app/{args.app}' + + # Define serial port + serial_port = serial.Serial('/dev/ttyMAX1', 115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1) + + # For detect Ctrl+C + signal.signal(signal.SIGINT, exit_handler) + + # Create ModbusTCP server + store = ModbusSlaveContext( + co=ModbusSequentialDataBlock(0, [0] * 100), # Coils + hr=ModbusSequentialDataBlock(0, [0] * 100) # Holding Registers + ) + + context = ModbusServerContext(slaves=store, single=True) + loop = asyncio.get_event_loop() + loop.run_until_complete(run_server(port=serial_port, data=store)) + + # while True: + # start = time.time() + # measurement_weight(port=serial_port, data=store) + # print(registers[0]) + + # end = time.time() + + # diff = end - start + + # if diff < 1: + # time.sleep(1 - diff) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cb9e8c8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +# Write package's name that need your app. +#awsiotsdk +#pyyaml +#sdtcloudpubsub +pyserial +pymodbus