From af65adfb47834db385c24cd63ae462076bae42c0 Mon Sep 17 00:00:00 2001 From: longqi Date: Mon, 26 Oct 2020 17:18:11 +0800 Subject: [PATCH] init --- .vscode/settings.json | 3 ++ Pipfile | 12 +++++++ Pipfile.lock | 36 ++++++++++++++++++++ README.md | 6 ++++ app.py | 77 +++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++ 6 files changed, 137 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 README.md create mode 100755 app.py create mode 100644 requirements.txt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9df2095 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/home/longqi/.local/share/virtualenvs/xnergy-example-V4bzqeLx/bin/python" +} \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..a8b26f6 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +minimalmodbus = "*" + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..7a1241b --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,36 @@ +{ + "_meta": { + "hash": { + "sha256": "d358730ee44b90784a6f9963013552670e5e6dec3c8d7bb5d885ce3e568ca43a" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "minimalmodbus": { + "hashes": [ + "sha256:5c55b1e26131e1f3b7fe55b950f8abb8a2396b77f73bc0a513cc3ef0051db526", + "sha256:ae979fa98887185d6ba9389e84038d49580a39241d969d098331ac225dd1b9ff" + ], + "index": "pypi", + "version": "==1.0.2" + }, + "pyserial": { + "hashes": [ + "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627", + "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8" + ], + "version": "==3.4" + } + }, + "develop": {} +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..13a5ba3 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# How to use + +Please use `python3` + +* `pip3 install -r requirements.txt` +* `python3 app.py PORT` diff --git a/app.py b/app.py new file mode 100755 index 0000000..6c5ef2c --- /dev/null +++ b/app.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +''' +The app will try to start charging +and show the charger voltage, battery voltage and charging current +stop charging in 30 seconds +''' +from minimalmodbus import Instrument, MODE_RTU +import serial +import time + +VERSION = '0.1.0' +UNIT = 16 + +MODBUS_FC_READ_SINGLE_COIL = int("0x01", 16) +MODBUS_FC_READ_SINGLE_DISCRETE = int("0x02", 16) +MODBUS_FC_READ_HOLDING_REGISTERS = int("0x03", 16) +MODBUS_FC_READ_INPUT_REGISTERS = int("0x04", 16) +MODBUS_FC_WRITE_SINGLE_REGISTER = int("0x06", 16) + +enable_charger_address = 0 +charger_voltage_adddress = 30 +batery_voltage_address = 32 +current_address = 31 + +def run(): + + import argparse + + parser = argparse.ArgumentParser(description='xnergy charger control demo') + + parser.add_argument('port', type=str, + help='The serial port(RS485) that connect to xnergy RCU') + + # parser.add_argument('-P', '--parallel', type=int, nargs='*', choices=(17, 18, 19), + # help='set to parallel mode, parameter is the unit id, can be used multiple times') + + parser.add_argument('-v', '--verbose', action='count', default=0, + help='verbose mode, show more information') + + args = parser.parse_args() + + instrument = Instrument(port=args.port, mode=MODE_RTU, slaveaddress=UNIT) + instrument.serial.baudrate = 9600 + # start charging + instrument.write_bit(registeraddress=enable_charger_address, value=1) + print('Start Charging, will stop charging in 30 seconds') + + counter = 0 + while True: + charger_voltage = instrument.read_registers(registeraddress=charger_voltage_adddress, number_of_registers=1, + functioncode=MODBUS_FC_READ_INPUT_REGISTERS) + batery_voltage = instrument.read_registers(registeraddress=batery_voltage_address, number_of_registers=1, + functioncode=MODBUS_FC_READ_INPUT_REGISTERS) + current = instrument.read_registers(registeraddress=current_address, number_of_registers=1, + functioncode=MODBUS_FC_READ_INPUT_REGISTERS) + + print( + str(counter) + ' ' + 'Charger voltage: ' + str(charger_voltage) + ' ' + 'Battery voltage: ' + str(batery_voltage) + ' ' + 'Current: ' + str(current) + , end='\r', flush=True) + + counter += 1 + if counter > 30: + break + time.sleep(1) + print() + + # stop charging + instrument.write_bit(registeraddress=enable_charger_address, value=0) + print('Stop Charging') + + +if __name__ == "__main__": + run() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3fa411d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +-i https://pypi.org/simple +minimalmodbus==1.0.2 +pyserial==3.4