Пример #1
0
    def test_tcp_client_connect(self):
        """ Test the tcp client connection method"""
        with patch.object(socket, 'create_connection') as mock_method:
            mock_method.return_value = object()
            client = ModbusTcpClient()
            self.assertTrue(client.connect())

        with patch.object(socket, 'create_connection') as mock_method:
            mock_method.side_effect = socket.error()
            client = ModbusTcpClient()
            self.assertFalse(client.connect())
Пример #2
0
    def test_tcp_client_connect(self):
        """ Test the tcp client connection method"""
        with patch.object(socket, 'create_connection') as mock_method:
            mock_method.return_value = object()
            client = ModbusTcpClient()
            self.assertTrue(client.connect())

        with patch.object(socket, 'create_connection') as mock_method:
            mock_method.side_effect = socket.error()
            client = ModbusTcpClient()
            self.assertFalse(client.connect())
Пример #3
0
def read_sensors(request):
    sensors = Sensor.objects.all()
    sensor_data = []
    dictionary = {}
    for sensor in sensors:
        client = ModbusTcpClient(sensor.address.server, port=502, timeout=1)
        try:
            client.connect()
            if sensor.sensor_type == Sensor.SensorType.DIGITAL:
                reply = client.read_discrete_inputs(sensor.channel, 1, unit=1)
                sensor_reading = reply.bits[0]
                sensor_response = {
                    'sensor_name': sensor.name,
                    'sensor_reading': sensor_reading
                }
                if sensor.digital_sensor_alert and sensor.email and str(
                        sensor_reading) != sensor.last_value:
                    if sensor.digital_alert_value and sensor_reading:
                        send_sensor_alert_email(sensor, str(sensor_reading))
                        #send_sensor_alert_email()
                    elif not sensor.digital_alert_value and not sensor_reading:
                        send_sensor_alert_email(sensor, str(sensor_reading))
                        #send_sensor_alert_email()
            else:
                reply = client.read_input_registers(sensor.channel, 1, unit=1)
                sensor_reading = round(
                    reply.registers[0] * sensor.conversion_factor, 2)
                if sensor.high_alert_value and sensor.email:
                    if sensor_reading > sensor.high_alert_value and float(
                            sensor.last_value) <= sensor.high_alert_value:
                        send_sensor_alert_email(sensor, str(sensor_reading))
                        #send_sensor_alert_email()
                if sensor.low_alert_value and sensor.email:
                    if sensor_reading < sensor.low_alert_value and float(
                            sensor.last_value) >= sensor.low_alert_value:
                        send_sensor_alert_email(sensor, str(sensor_reading))
                        #send_sensor_alert_email()
            sensor.last_value = str(sensor_reading)
            sensor.save()
            client.close()
        except:
            sensor_reading = "Could Not Connect"
        sensor_response = {
            'sensor_name': sensor.name,
            'sensor_reading': sensor_reading
        }
        sensor_data.append(sensor_response)
        client.close()
    dictionary['sensor_data'] = sensor_data
    return render(request, 'sensors/sensor_data.html', dictionary)
Пример #4
0
    def setRelayState(interlock: Interlock_model,
                      state: {0, 1}) -> Interlock_model.State:

        client = ModbusTcpClient(interlock.card.server)
        client.connect()
        client.write_coil(interlock.channel, state, unit=1)
        sleep(0.3)
        reply = client.read_coils(interlock.channel, 1, unit=1)
        state = reply.bits[0]
        client.close()
        if state == ModbusInterlock.MODBUS_OFF:
            return Interlock_model.State.LOCKED
        elif state == ModbusInterlock.MODBUS_ON:
            return Interlock_model.State.UNLOCKED
Пример #5
0
class Modbus:
    def __init__(self, uri='localhost', port=502):
        self.host = socket.gethostbyname(uri)
        self.client = ModbusClient(self.host, port=port)
        self.client.connect()
        # // TODO implement a fallback
        # if not self.client:
        #     raise RuntimeError('Error establishing connection with uri {}'.format(uri))

    def _read(self, response, typ='Float32'):
        if typ == 'Float32':
            raw = struct.pack('>HH', response.get_register(1), response.get_register(0))
            return struct.unpack('>f', raw)[0]

    def read(self, register, n, unit=1, typ='Float32'):
        response = self.client.read_holding_registers(register, n, unit=unit)
        return self._read(response, typ)

    def readN(self, registers, n, unit=1):
        # // TODO implement reading multiple registers
        pass
Пример #6
0
    def test_basic_sync_tcp_client(self):
        """ Test the basic methods for the tcp sync client"""

        # receive/send
        client = ModbusTcpClient()
        client.socket = MockSocket()
        self.assertEqual(0, client.send(None))
        self.assertEqual(1, client.send('\x00'))
        self.assertEqual('\x00', client.receive(1))

        # connect/disconnect
        self.assertTrue(client.connect())
        client.close()

        # already closed socket
        client.socket = False
        client.close()

        self.assertEqual("127.0.0.1:502", str(client))
Пример #7
0
    def test_basic_sync_tcp_client(self):
        """ Test the basic methods for the tcp sync client"""

        # receive/send
        client = ModbusTcpClient()
        client.socket = MockSocket()
        self.assertEqual(0, client.send(None))
        self.assertEqual(1, client.send('\x00'))
        self.assertEqual('\x00', client.receive(1))

        # connect/disconnect
        self.assertTrue(client.connect())
        client.close()

        # already closed socket
        client.socket = False
        client.close()

        self.assertEqual("127.0.0.1:502", str(client))
Пример #8
0
class HeliosTCP(SmartPlugin):

    PLUGIN_VERSION = "1.0.2"
    MODBUS_SLAVE = 180
    PORT = 502
    START_REGISTER = 1

    _items = {}

    def __init__(self, sh):
        from bin.smarthome import VERSION
        if '.'.join(VERSION.split('.', 2)[:2]) <= '1.5':
            self.logger = logging.getLogger(__name__)

        self._helios_ip = self.get_parameter_value('helios_ip')
        self._client = ModbusTcpClient(self._helios_ip)
        self.alive = False
        self._is_connected = False
        self._update_cycle = self.get_parameter_value('update_cycle')

    def run(self):
        """
        Run method for the plugin
        """
        self.logger.debug("Run method called")
        self._is_connected = self._client.connect()
        if not self._is_connected:
            self.logger.error(
                "Helios TCP: Failed to connect to Modbus Server at {0}".format(
                    self._helios_ip))
        self.scheduler_add('Helios TCP',
                           self._update_values,
                           cycle=self._update_cycle)
        self.alive = True

    def stop(self):
        """
        Stop method for the plugin
        """
        self.logger.debug("Stop method called")
        self.scheduler_remove('Helios TCP')
        self._client.close()
        self.alive = False

    def parse_item(self, item):
        if 'helios_tcp' in item.conf:
            varname = item.conf['helios_tcp']
            if varname in VARLIST.keys():
                self._items[varname] = item
                return self.update_item
            else:
                self.logger.warning(
                    "Helios TCP: Ignoring unknown variable '{0}'".format(
                        varname))

    def _update_values(self):
        for item in self._items:
            self._read_value(self._items[item])

    @staticmethod
    def _string_to_registers(instr: str):
        l = bytearray(instr, 'ascii')
        return [k[0] * 256 + k[1] for k in zip(l[::2], l[1::2])] + [0]

    def _read_value(self, item):
        try:
            var = item.conf['helios_tcp']
        except ValueError:
            return

        try:
            varprop = VARLIST[var]
        except KeyError:
            self.logger.error(
                "Helios TCP: Failed to find variable '{0}'".format(var))
            return

        # At first we write the variable name to read into the input registers:
        payload = self._string_to_registers(varprop['var'])
        request = self._client.write_registers(self.START_REGISTER,
                                               payload,
                                               unit=self.MODBUS_SLAVE)
        if request is None:
            self.logger.warning(
                "Helios TCP: Failed to send read request for variable '{0}'".
                format(var))
            return

        # Now we may read the holding registers:
        response = self._client.read_holding_registers(self.START_REGISTER,
                                                       varprop['length'],
                                                       unit=self.MODBUS_SLAVE)
        if response is None:
            self.logger.warning(
                "Helios TCP: Failed to send read response for variable '{0}'".
                format(var))
            return

        # Now we may dedocde the result
        # Note that we immediatly strip the varname from the result.
        result = response.encode().decode('ascii')[8:]
        result = list(result)

        # Remove trailing zeros:
        while result[-1] == '\x00':
            result.pop()

        result = ''.join(result)

        # Finally we may cast the result and return the obtained value:
        try:
            item(varprop["type"](result), self.get_shortname())
        except ValueError:
            self.logger.warning(
                "Helios TCP: Could not assign {0} to item {1}".format(
                    varprop["type"](result), item.id()))
            return

    def update_item(self, item, caller=None, source=None, dest=None):
        """
        Item has been updated

        This method is called, if the value of an item has been updated by SmartHomeNG.
        It should write the changed value out to the device (hardware/interface) that
        is managed by this plugin.

        :param item: item to be updated towards the plugin
        :param caller: if given it represents the callers name
        :param source: if given it represents the source
        :param dest: if given it represents the dest
        """
        if self.alive and caller != self.get_shortname():
            try:
                var = item.conf['helios_tcp']
            except ValueError:
                return

            newval = item()

            try:
                varprop = VARLIST[var]
            except KeyError:
                self.logger.error(
                    "Helios TCP: Failed to find variable '{0}'".format(var))
                return

            if not varprop["write"]:
                return

            if type(newval) != varprop["type"]:
                self.logger.error(
                    "Helios TCP: Type mismatch for variable '{0}'".format(var))
                return

            if newval < varprop["min"] or newval > varprop["max"]:
                self.logger.error(
                    "Helios TCP: Variable '{0}' out of bounds. The allowed range is [{1}, {2}]"
                    .format(var, varprop["min"], varprop["max"]))
                return

            if varprop["type"] == bool:
                payload_string = "{0}={1}".format(varprop["var"], int(newval))
            elif varprop["type"] == int:
                payload_string = "{0}={1}".format(varprop["var"], int(newval))
            elif varprop["type"] == float:
                payload_string = "{0}={1:.1f}".format(varprop["var"], newval)
            else:
                self.logger.error(
                    "Helios TCP: Type {0} of varible '{1}' not known".format(
                        varprop["type"], var))
                return

            payload = self._string_to_registers(payload_string)
            request = self._client.write_registers(self.START_REGISTER,
                                                   payload,
                                                   unit=self.MODBUS_SLAVE)
            if request is None:
                self.logger.warning(
                    "Helios TCP: Failed to send write request for variable '{0}'"
                    .format(var))
                return
Пример #9
0
STOP = 35700 #This are control keys
STOPC = 29835 #This are complements of control keys, must be write together with the control key
AUTO = 35701
AUTOC = 29834
MANUAL = 35702
MANUALC = 29833
AUTOM = 35704
AUTOMC = 29831
START = 35705
STARTC = 29830
RESETAL = 35734

host = sys.argv[1]
print("Connecting to DSE with IP ", host)
client = ModbusClient(str(host), port = 502)
client.connect()
time.sleep(0.1)

def sync_client_read(registerNumber):
	try:
		result = client.read_holding_registers(registerNumber,1)
		return result.registers
	except:
		print("Connection Error Handled")
		output = False
		return output

def read_register(PageNumber, RegisterOffset, Scale):
	register = 256 * PageNumber + RegisterOffset
	read = sync_client_read(register)
	register = float(read[0]) * Scale
Пример #10
0
import os
from datetime import datetime

#---------------------------------------------------------------------------# 
# configure the client logging
#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.INFO)

#---------------------------------------------------------------------------# 
# We are going to use a simple client to send our requests
#---------------------------------------------------------------------------# 
client = ModbusClient('192.168.33.1', port=10502)
client.connect()

FILENAME = 'rtu_5_log.csv'

try: 
  os.remove(FILENAME)
except OSError:
  pass

print("*"*30)
print("SCADA server, reading the values of switch states, current and voltage readings")
print("*"*30+"\n\n")

fd = open(FILENAME, 'w+')
csvrow = "timestamp;switch19;switch24;switch25;switch36;voltageb5;current19;current24;current25;current36\n"
fd.write(csvrow)
Пример #11
0
#working ------- 1 seferde 124 tane cektik
from pymodbus3.client.sync import ModbusTcpClient
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#defaults
ip="188.59.150.237"
start="0"
count="3"
unit_number="2"

#get necessary values


#modbus connection
client = ModbusTcpClient(ip)
connection = client.connect()

#read register
request = client.read_holding_registers(int(start),int(count),unit=int(unit_number))
result = request.registers
print (result) #result is the array of register values, can be accesses as result[i]



#ege
Пример #12
0
def main():
    registersPerPage = 256
    RPMPageNumber = 4
    RPMRegisterOffset = 6
    DCCurrentPageNumber = 4
    DCCurrentStartOffset = 204
    DCCurrentEndOffset = 205
    STOP = 35700
    # 10001011(H8B,D139) 01110100(H74,116)  # -29836 (35700)
    STOPC = 29835
    # 01110100(H74,D116) 10001011(H8B,D139) #  29835
    AUTO = 35701
    # 10001011(H8B,D139) 01110101(H75,D117) # -29835 (35701)
    AUTOC = 29834
    # 01110100(H74,D116) 10001010(H8A,D138) #  29834
    MANUAL = 35702
    # 10001011(H8B,D139) 01110110(H76,D118) # -29834 (35702)
    MANUALC = 29833
    # 01110100(H74,D116) 10001001(H89,D137) #  29833
    AUTOM = 35704
    # 10001011(H8B,D139) 01111000(H78,D120) # -29832 (35704)
    AUTOMC = 29831
    # 01110100(H74,D116) 10000111(H87,D135) #  29831
    START = 35705
    # 10001011(H8B,D139) 01111001(H79,D121) # -29831 (35705)
    STARTC = 29830
    # 01110100(H74,D116) 10000110(H87,D134) #  29830
    RESETAL = 35734
    # 10001011(H8B,D139) 10010110(H96,D150) # -35734 (35734)
    #RESETALC =  29801;    #
    #RESETA2  =  35734;    # 10001011(H8B,D139) 10010110(H96,D150) #  (35734)
    #RESETA2C =  29828;
    #RESETAT  = -29801;    # 10001011(H8B,D139) 10010110(H96,D150) # -35734 (35734)
    #RESETATC =  29800;
    MODE_STOP = 0
    #Stop mode
    MODE_AUTO = 1
    #Auto mode
    MODE_MANUAL = 2
    #Manual mode
    MODE_TEST = 3
    #Test on load mode
    MODE_AUTO_MRESTORE = 4
    #Auto with manual restore mode/Prohibit Return
    MODE_USER_CONFIG = 5
    #User configuration mode
    MODE_TEST_OFF_LOAD = 6
    #Test off load mode

    host = sys.argv[1]
    print(host)
    client = ModbusClient(str(host), port=502)
    client.connect()
    time.sleep(0.1)

    rm = client.write_registers(4104, [MANUAL, MANUALC])
    print("Change DSE to MANUAL mode, starting engine in 5 seconds...")

    x = 4
    while x >= 1:
        time.sleep(1)
        print(str(x))
        x -= 1

    rq = client.write_registers(4104, [START, STARTC])
    time.sleep(3)
    print("Starting engine, proceding to read RPM and DC current")
    time.sleep(1)

    x = 1
    while x == 1:
        time.sleep(0.01)
        register = registersPerPage * RPMPageNumber + RPMRegisterOffset
        global RPMRegister
        RPMRegister = sync_client_read(register)
        register = registersPerPage * DCCurrentPageNumber + DCCurrentEndOffset
        global DCRegister
        DCRegister = sync_client_read(register)
        DCRegister = float(DCRegister)
        x = 0
        os.system('sudo python3 readings.py')

    while 1 == 1:
        time.sleep(0.01)
        register = registersPerPage * RPMPageNumber + RPMRegisterOffset
        RPMRegister = sync_client_read(register)
        register = registersPerPage * DCCurrentPageNumber + DCCurrentEndOffset
        DCregister = sync_client_read(register)
        DCRegister = float(DCRegister)
Пример #13
0
        global read_discrete_inputs_data
        global discrete_inputs_data
        if discrete_inputs_data != read_discrete_inputs_data:
            msg = str(read_discrete_inputs_data)
            rc, mid = mqtt_client.publish("one2one/fpq", payload=msg, qos=1)  # qos
            on_publish(msg, rc)
            print(read_discrete_inputs_data)
            discrete_inputs_data = read_discrete_inputs_data


logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.CRITICAL)

modbus_client = ModbusClient('192.168.1.133', port=503, retries=2, framer=ModbusFramer)
modbus_client.connect()

write_coils_data = []
read_discrete_inputs_data = []
discrete_inputs_data = []
threads_switch = 1

while True:
    time.sleep(1)
'''
threads = []
t1 = threading.Thread(target=modbus_rr)
threads.append(t1)
t2 = threading.Thread(target=modbus_print)
threads.append(t2)
Пример #14
0
def plugin_poll(handle):
    """ Poll readings from the modbus device and returns it in a JSON document as a Python dict.

    Available for poll mode only.

    Args:
        handle: handle returned by the plugin initialisation call
    Returns:
        returns a reading in a JSON document, as a Python dict, if it is available
        None - If no reading is available
    Raises:
    """

    try:
        global mbus_client
        if mbus_client is None:
            try:
                source_address = handle['address']['value']
                source_port = int(handle['port']['value'])
            except Exception as ex:
                e_msg = 'Failed to parse Modbus TCP address and / or port configuration.'
                _LOGGER.error('%s %s', e_msg, str(ex))
                raise ValueError(e_msg)
            try:
                mbus_client = ModbusTcpClient(host=source_address, port=source_port)
                mbus_client_connected = mbus_client.connect()
                if mbus_client_connected:
                    _LOGGER.info('Modbus TCP Client is connected. %s:%d', source_address, source_port)
                else:
                    raise RuntimeError("Modbus TCP Connection failed!")
            except:
                mbus_client = None
                _LOGGER.warn('Failed to connect! Modbus TCP host %s on port %d', source_address, source_port)
                return

        """ 
        read_coils(self, address, count=1, **kwargs)  
        read_discrete_inputs(self, address, count=1, **kwargs)
        read_holding_registers(self, address, count=1, **kwargs)
        read_input_registers(self, address, count=1, **kwargs)
        
            - address: The starting address to read from
            - count: The number of coils / discrete or registers to read
            - unit: The slave unit this request is targeting
            
            On TCP/IP, the MODBUS server is addressed using its IP address; therefore, the MODBUS Unit Identifier is useless. 

            Remark : The value 0 is also accepted to communicate directly to a MODBUS TCP device.
        """
        unit_id = UNIT
        modbus_map = json.loads(handle['map']['value'])

        readings = {}

        # Read coils
        coils_address_info = modbus_map['coils']
        if len(coils_address_info) > 0:
            for k, address in coils_address_info.items():
                coil_bit_values = mbus_client.read_coils(99 + int(address), 1, unit=unit_id)
                readings.update({k: coil_bit_values.bits[0]})

        # Discrete input
        discrete_input_info = modbus_map['inputs']
        if len(discrete_input_info) > 0:
            for k, address in discrete_input_info.items():
                read_discrete_inputs = mbus_client.read_discrete_inputs(99 + int(address), 1, unit=unit_id)
                readings.update({k:  read_discrete_inputs.bits[0]})

        # Holding registers
        holding_registers_info = modbus_map['registers']
        if len(holding_registers_info) > 0:
            for k, address in holding_registers_info.items():
                register_values = mbus_client.read_holding_registers(99 + int(address), 1, unit=unit_id)
                readings.update({k: register_values.registers[0]})

        # Read input registers
        input_registers_info = modbus_map['inputRegisters']
        if len(input_registers_info) > 0:
            for k, address in input_registers_info.items():
                read_input_reg = mbus_client.read_input_registers(99 + int(address), 1, unit=unit_id)
                readings.update({k: read_input_reg.registers[0] })

        wrapper = {
            'asset': handle['assetName']['value'],
            'timestamp': utils.local_timestamp(),
            'key': str(uuid.uuid4()),
            'readings': readings
        }

    except Exception as ex:
        _LOGGER.error('Failed to read data from modbus device. Got error %s', str(ex))
        raise ex
    else:
        return wrapper
Пример #15
0
class ModbusClient(threading.Thread):
    """Define Tag engine to poll MODBUS servers.

    """
    def __init__(self, asset_read_dict, asset_write_dict, interface_config):
        """ interface config
        ('ip_add', '0.0.0.0')
        ('endian', '>')
        ('registers', {
            'type': '32bit_float',
            'name': 'kw',
            'scale': 0.001,
            'mod_add': 50052})
        ('update_rate', 1)

        """
        threading.Thread.__init__(self)

        self.config = interface_config

        self.daemon = True  # TODO: this may be threading in 2.7, daemon is method now?

        self.client = None
        self.cvt = dict()
        self.process_stop = False
        self.connected = False
        self.timestamp = str()

        # Initialize Current Value Table (CVT)
        for reg in self.config['registers']:
            self.cvt.update({reg['name']: None})

    def __del__(self):
        """Teardown

        """
        print('MODBUS CLIENT:', self.process_name, '-- deconstructed')

    def run(self):
        """Connect to target and maintain client while loop.

        Call with Thread.start()
        """
        print('MODBUS CLIENT', self.process_name, '-- started')
        self.connect()

        while not self.process_stop:
            if self.connected:
                self._update()
            time.sleep(self.config['update_rate'])

        self.disconnect()
        self.__del__()

    def stop(self):
        """Stop process

        """
        self.process_stop = True

    def connect(self):
        """Connect to target MODBUS server.

        """
        try:
            self.client = ModbusTcpClient(self.config['ip_add'])
            self.client.connect()
            self.connected = True
        except:
            print('MODBUS CLIENT:', self.process_name,
                  '-- unable to connect to target server.')

    def disconnect(self):
        """Disconnect from target MODBUS server.

        """
        try:
            self.client.close()
            self.connected = False
            print('MODBUS CLIENT:', self.process_name, '-- disconnected')
        except:
            print('MODBUS CLIENT:', self.process_name,
                  '-- failed to disconnect from server')

    def _update(self):
        """Poll MODBUS target server.

        Store results in self.cvt
        """
        for reg in self.config['registers']:

            try:
                """TODO: filter by register_name_list"""

                if reg['type'] == '32bit_float':
                    read_data = self.client.read_holding_registers(
                        reg['mod_add'], 2, unit=1)
                    decoded_data = BinaryPayloadDecoder.from_registers(
                        list(reversed(read_data.registers)),
                        endian=self.config['endian'])
                    self.cvt[reg['name']] = decoded_data.decode_32bit_float(
                    ) * reg['scale']

                elif reg['type'] == '32bit_int':
                    read_data = self.client.read_holding_registers(
                        reg['mod_add'], 2, unit=1)
                    decoded_data = BinaryPayloadDecoder.from_registers(
                        read_data.registers, endian=self.config['endian'])
                    self.cvt[reg['name']] = decoded_data.decode_32bit_int(
                    ) * reg['scale']

                elif reg['type'] == '32bit_uint':
                    read_data = self.client.read_holding_registers(
                        reg['mod_add'], 2, unit=1)
                    decoded_data = BinaryPayloadDecoder.from_registers(
                        read_data.registers, endian=self.config['endian'])
                    self.cvt[reg['name']] = decoded_data.decode_32bit_uint(
                    ) * reg['scale']

                elif reg['type'] == '16bit_int':
                    read_data = self.client.read_holding_registers(
                        reg['mod_add'], 1, unit=1)
                    decoded_data = BinaryPayloadDecoder.from_registers(
                        read_data.registers, endian=self.config['endian'])
                    self.cvt[reg['name']] = decoded_data.decode_16bit_int(
                    ) * reg['scale']

                elif reg['type'] == '16bit_uint':
                    read_data = self.client.read_holding_registers(
                        reg['mod_add'], 1, unit=1)
                    decoded_data = BinaryPayloadDecoder.from_registers(
                        read_data.registers, endian=self.config['endian'])
                    self.cvt[reg['name']] = decoded_data.decode_16bit_uint(
                    ) * reg['scale']

                else:
                    print(reg['type'], 'data type not supported')

            except AttributeError:
                print(self.process_name, 'MODBUS CLIENT: Read error')
                # TODO: How to import pymobus3 exceptions?

        self.timestamp = time.ctime()

    def write(self):
        pass  # TODO: write holding registers
Пример #16
0
def main():            
	registersPerPage = 256
	RPMPageNumber = 4
	RPMRegisterOffset = 6
	DCCurrentPageNumber = 4
	DCCurrentStartOffset = 204
	DCCurrentEndOffset = 205
	STOP     =  35700;    # 10001011(H8B,D139) 01110100(H74,116)  # -29836 (35700)
	STOPC    =  29835;    # 01110100(H74,D116) 10001011(H8B,D139) #  29835
	AUTO     =  35701;    # 10001011(H8B,D139) 01110101(H75,D117) # -29835 (35701)
	AUTOC    =  29834;    # 01110100(H74,D116) 10001010(H8A,D138) #  29834
	MANUAL   =  35702;    # 10001011(H8B,D139) 01110110(H76,D118) # -29834 (35702)
	MANUALC  =  29833;    # 01110100(H74,D116) 10001001(H89,D137) #  29833
	AUTOM    =  35704;    # 10001011(H8B,D139) 01111000(H78,D120) # -29832 (35704)
	AUTOMC   =  29831;    # 01110100(H74,D116) 10000111(H87,D135) #  29831
	START    =  35705;    # 10001011(H8B,D139) 01111001(H79,D121) # -29831 (35705)
	STARTC   =  29830;    # 01110100(H74,D116) 10000110(H87,D134) #  29830
	RESETAL  =  35734;    # 10001011(H8B,D139) 10010110(H96,D150) # -35734 (35734)
	#RESETALC =  29801;    # 
	#RESETA2  =  35734;    # 10001011(H8B,D139) 10010110(H96,D150) #  (35734)
	#RESETA2C =  29828;
	#RESETAT  = -29801;    # 10001011(H8B,D139) 10010110(H96,D150) # -35734 (35734)
	#RESETATC =  29800;    
	MODE_STOP          = 0; #Stop mode
	MODE_AUTO          = 1; #Auto mode
	MODE_MANUAL        = 2; #Manual mode
	MODE_TEST          = 3; #Test on load mode
	MODE_AUTO_MRESTORE = 4; #Auto with manual restore mode/Prohibit Return
	MODE_USER_CONFIG   = 5; #User configuration mode
	MODE_TEST_OFF_LOAD = 6; #Test off load mode

	host = sys.argv[1]
	print(host)
	client = ModbusClient(str(host), port=502)
	client.connect()
	time.sleep(0.1)

	rm = client.write_registers(4104, [MANUAL,MANUALC])
	print("Change DSE to MANUAL mode, starting engine in 5 seconds...")

	x = 4
	while x>=1:
		time.sleep(1)
		print(str(x))
		x-=1

	rq = client.write_registers(4104, [START,STARTC])
	time.sleep(3)
	print("Starting engine, proceding to read RPM and DC current")
	time.sleep(1)

	x = 1
	while x==1:
		time.sleep(0.01)
		register = registersPerPage * RPMPageNumber + RPMRegisterOffset
		global RPMRegister
		RPMRegister  = sync_client_read(register)
		register = registersPerPage * DCCurrentPageNumber + DCCurrentEndOffset
		global DCRegister
		DCRegister = sync_client_read(register)
		DCRegister = float(DCRegister)
		x = 0
		os.system('sudo python3 readings.py')

	while 1==1:
		time.sleep(0.01)
		register = registersPerPage * RPMPageNumber + RPMRegisterOffset
		RPMRegister  = sync_client_read(register)
		register = registersPerPage * DCCurrentPageNumber + DCCurrentEndOffset
		DCregister  = sync_client_read(register)
		DCRegister  = float(DCRegister)
Пример #17
0
def selectTarget():
    clientIP = str(input('\n\tTarget IP? '))
    client = ModbusTcpClient(clientIP)
    client.connect()
    return client