Esempio n. 1
0
        public override ModbusFunction ReadCoils(ReadCoilsRequest request)
        {
            var coilArray = ReadCoilsOrInputs(request.Quantity);
            var response  = new ReadCoilsResponse(coilArray);

            return(response);
        }
Esempio n. 2
0
        public void ReadCoilsRequestToString()
        {
            // Arrange
            var request = new ReadCoilsRequest(5, 1, 10);

            // Act/Assert
            Assert.Equal("Read 10 coils starting at address 1 from slave 5", request.ToString());
        }
Esempio n. 3
0
        public async Task <bool[]> ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints, CancellationToken token = default)
        {
            ValidateNumberOfPoints(numberOfPoints, 2000);

            var request = new ReadCoilsRequest(slaveAddress, startAddress, numberOfPoints);

            using (var response = await Transport.SendAsync <ReadCoilsResponse>(request, token).ConfigureAwait(false))
            {
                return(response.Data.Slice(0, request.NumberOfPoints).ToArray());
            }
        }
Esempio n. 4
0
        public ReadCoilsResponse ReadCoils(ushort startingAddress, ushort quantity)
        {
            var function = new ReadCoilsRequest(startingAddress, quantity);

            return(CallModbusFunctionSync <ReadCoilsResponse>(function));
        }
Esempio n. 5
0
        public ushort ReadCoilsAsync(ushort startingAddress, ushort quantity)
        {
            var function = new ReadCoilsRequest(startingAddress, quantity);

            return(CallModbusFunction(function));
        }
 public abstract ModbusFunction ReadCoils(ReadCoilsRequest request);
Esempio n. 7
0
        // folosit la primul test cu placuta
        void Modbus_ReadCoilsResponse(ReadCoilsRequest RCRequest)
        {
            Array.Clear(g_aucCoils, 0, g_aucCoils.Length);
            if (g_ReadCoilsReq.m_ucAddress == 0xEC)
            {
                if (0x0001 <= RCRequest.m_unNumberOfCoils && RCRequest.m_unNumberOfCoils <= 0x07D0)
                {
                    if ((RCRequest.m_unStartingAddress >= 0x0000 && RCRequest.m_unStartingAddress <= 0xFFFF) &&
                        (RCRequest.m_unStartingAddress + RCRequest.m_unNumberOfCoils <= 0xFFFF))
                    {
                        if (RCRequest.m_unNumberOfCoils % 8 == 0)
                        {
                            g_ReadCoilsResp.m_ucByteCount = (byte)(RCRequest.m_unNumberOfCoils / 8);
                        }
                        else
                        {
                            g_ReadCoilsResp.m_ucByteCount = (byte)(RCRequest.m_unNumberOfCoils / 8 + 1);
                        }

                        g_ReadCoilsResp.m_ucAddress      = MODBUS_ADDRESS;
                        g_ReadCoilsResp.m_ucFunctionCode = RCRequest.m_ucFunctionCode;
                        ushort i, j;
                        //printf("byte count: %d\n", g_ReadCoilsResp.m_ucByteCount);
                        for (i = 0; i < g_ReadCoilsResp.m_ucByteCount; i++)
                        {
                            for (j = 0; j < 8; j++)
                            {
                                if (i * 8 + j >= RCRequest.m_unNumberOfCoils)
                                {
                                    break;
                                }
                                g_ReadCoilsResp.m_aucCoilsVal[i] += (byte)(g_aucCoils[i * 8 + j] << j);
                                //printf("gauc coils: %x\t", g_aucCoils[i * 8 + j]);
                                //printf("response coils: %x\n", g_ReadCoilsResp.m_ucCoilStatus[i]);
                            }
                        }
                        // copiere in adu <- response
                        //memcpy(g_aucTxADU, &g_ReadCoilsResp, (3 + g_ReadCoilsResp.m_ucByteCount));
                        g_aucTxADU[0] = g_ReadCoilsResp.m_ucAddress;
                        g_aucTxADU[1] = g_ReadCoilsResp.m_ucFunctionCode;
                        g_aucTxADU[2] = g_ReadCoilsResp.m_ucByteCount;
                        Array.Copy(g_aucTxADU, 3, g_ReadCoilsResp.m_aucCoilsVal, 0, g_ReadCoilsResp.m_ucByteCount);
                        _serialPort.Write(g_aucTxADU, 0, 3 + g_ReadCoilsResp.m_ucByteCount);
                    }
                    else
                    {
                        g_ExceptionResp.m_ucExceptionCode         = 0x02;
                        g_ExceptionResp.m_ucExceptionFunctionCode = (byte)(RCRequest.m_ucFunctionCode + 0x80);
                        g_aucTxADU[0] = MODBUS_ADDRESS;
                        g_aucTxADU[1] = g_ExceptionResp.m_ucExceptionFunctionCode;
                        g_aucTxADU[2] = g_ExceptionResp.m_ucExceptionCode;
                        _serialPort.Write(g_aucTxADU, 0, 3);
                        //printf("out of bounds");
                    }
                }
                else
                {
                    g_ExceptionResp.m_ucExceptionCode         = 0x03;
                    g_ExceptionResp.m_ucExceptionFunctionCode = (byte)(RCRequest.m_ucFunctionCode + 0x80);
                    g_aucTxADU[0] = MODBUS_ADDRESS;
                    g_aucTxADU[1] = g_ExceptionResp.m_ucExceptionFunctionCode;
                    g_aucTxADU[2] = g_ExceptionResp.m_ucExceptionCode;
                    _serialPort.Write(g_aucTxADU, 0, 3);
                    //printf("coils > 2000");
                }
            }
        }
Esempio n. 8
0
        static void TestMessage()
        {
            ModbusMessage fc01Req = new ReadCoilsRequest(0x13, 0x13);
            ModbusMessage fc01Res = new ReadCoilsResponse(true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, false, true, false, true, false);
            ModbusMessage fc02Req = new ReadDiscreteInputsRequest(0xc4, 0x16);
            ModbusMessage fc02Res = new ReadDiscreteInputsResponse(false, false, true, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true);
            ModbusMessage fc03Req = new ReadHoldingRegistersRequest(0x6b, 0x03);
            ModbusMessage fc03Res = new ReadHoldingRegistersResponse(0x022b, 0x0000, 0x0064);
            ModbusMessage fc04Req = new ReadInputRegistersRequest(0x08, 0x01);
            ModbusMessage fc04Res = new ReadInputRegistersResponse(0x000a);
            ModbusMessage fc05Req = new WriteSingleCoilRequest(0xac, true);
            ModbusMessage fc05Res = new WriteSingleCoilResponse(0xac, true);
            ModbusMessage fc06Req = new WriteSingleRegisterRequest(0x01, 0x0003);
            ModbusMessage fc06Res = new WriteSingleRegisterResponse(0x01, 0x0003);
            ModbusMessage fc0fReq = new WriteMultipleCoilsRequest(0x13, true, false, true, true, false, false, true, true, true, false);
            ModbusMessage fc0fRes = new WriteMultipleCoilsResponse(0x13, 0x0a);
            ModbusMessage fc10Req = new WriteMultipleRegistersRequest(0x01, 0x000a, 0x0102);
            ModbusMessage fc10Res = new WriteMultipleRegistersResponse(0x01, 0x02);

            PrintMessagePDU(fc01Req);
            PrintMessagePDU(fc01Res);
            PrintMessagePDU(fc02Req);
            PrintMessagePDU(fc02Res);
            PrintMessagePDU(fc03Req);
            PrintMessagePDU(fc03Res);
            PrintMessagePDU(fc04Req);
            PrintMessagePDU(fc04Res);
            PrintMessagePDU(fc05Req);
            PrintMessagePDU(fc05Res);
            PrintMessagePDU(fc06Req);
            PrintMessagePDU(fc06Res);
            PrintMessagePDU(fc0fReq);
            PrintMessagePDU(fc0fRes);
            PrintMessagePDU(fc10Req);
            PrintMessagePDU(fc10Res);

            Assert(MessagePDU(fc01Req) == "Req.: 01 00 13 00 13", $"{nameof(fc01Req)} Fail");
            Assert(MessagePDU(fc01Res) == "Res.: 01 03 cd 6b 05", $"{nameof(fc01Res)} Fail");
            Assert(MessagePDU(fc02Req) == "Req.: 02 00 c4 00 16", $"{nameof(fc02Req)} Fail");
            Assert(MessagePDU(fc02Res) == "Res.: 02 03 ac db 35", $"{nameof(fc02Res)} Fail");
            Assert(MessagePDU(fc03Req) == "Req.: 03 00 6b 00 03", $"{nameof(fc03Req)} Fail");
            Assert(MessagePDU(fc03Res) == "Res.: 03 06 02 2b 00 00 00 64", $"{nameof(fc03Res)} Fail");
            Assert(MessagePDU(fc04Req) == "Req.: 04 00 08 00 01", $"{nameof(fc04Req)} Fail");
            Assert(MessagePDU(fc04Res) == "Res.: 04 02 00 0a", $"{nameof(fc04Res)} Fail");
            Assert(MessagePDU(fc05Req) == "Req.: 05 00 ac ff 00", $"{nameof(fc05Req)} Fail");
            Assert(MessagePDU(fc05Res) == "Res.: 05 00 ac ff 00", $"{nameof(fc05Res)} Fail");
            Assert(MessagePDU(fc06Req) == "Req.: 06 00 01 00 03", $"{nameof(fc06Req)} Fail");
            Assert(MessagePDU(fc06Res) == "Res.: 06 00 01 00 03", $"{nameof(fc06Res)} Fail");
            Assert(MessagePDU(fc0fReq) == "Req.: 0f 00 13 00 0a 02 cd 01", $"{nameof(fc0fReq)} Fail");
            Assert(MessagePDU(fc0fRes) == "Res.: 0f 00 13 00 0a", $"{nameof(fc0fRes)} Fail");
            Assert(MessagePDU(fc10Req) == "Req.: 10 00 01 00 02 04 00 0a 01 02", $"{nameof(fc10Req)} Fail");
            Assert(MessagePDU(fc10Res) == "Res.: 10 00 01 00 02", $"{nameof(fc10Res)} Fail");

            Assert(fc01Req.FunctionCode == (FunctionCode)0x01);
            Assert(fc01Res.FunctionCode == (FunctionCode)0x01);
            Assert(fc02Req.FunctionCode == (FunctionCode)0x02);
            Assert(fc02Res.FunctionCode == (FunctionCode)0x02);
            Assert(fc03Req.FunctionCode == (FunctionCode)0x03);
            Assert(fc03Res.FunctionCode == (FunctionCode)0x03);
            Assert(fc04Req.FunctionCode == (FunctionCode)0x04);
            Assert(fc04Res.FunctionCode == (FunctionCode)0x04);
            Assert(fc05Req.FunctionCode == (FunctionCode)0x05);
            Assert(fc05Res.FunctionCode == (FunctionCode)0x05);
            Assert(fc06Req.FunctionCode == (FunctionCode)0x06);
            Assert(fc06Res.FunctionCode == (FunctionCode)0x06);
            Assert(fc0fReq.FunctionCode == (FunctionCode)0x0f);
            Assert(fc0fRes.FunctionCode == (FunctionCode)0x0f);
            Assert(fc10Req.FunctionCode == (FunctionCode)0x10);
            Assert(fc10Res.FunctionCode == (FunctionCode)0x10);
        }