bool WriteModbusData(modbusrtu ModbusRtu, byte SlaveAddr, ushort ModbusAddr, string datatype, string sValue) { ushort ntype = (ushort)(ModbusAddr / 10000); ushort naddr = (ushort)(ModbusAddr % 10000); bool bok = false; naddr = (ushort)(naddr - 1); switch (ntype) { case 0: //DO short[] coils = new short[1]; if (sValue.Equals("1")) { coils[0] = 1; } else { coils[0] = 0; } bok = ModbusRtu.SendFc5(SlaveAddr, naddr, coils[0]); break; case 4: //AO if (datatype.Equals("uint16")) { ushort[] registerhold = new ushort[1]; registerhold[0] = ushort.Parse(sValue); bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 1, registerhold); } else if (datatype.Equals("int16")) { ushort[] registerhold = new ushort[1]; registerhold[0] = (ushort)short.Parse(sValue); bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 1, registerhold); } else if (datatype.Equals("float")) { ushort[] registerhold = new ushort[2]; int intValue = int.Parse(sValue); registerhold[1] = (ushort)(intValue >> 16); registerhold[0] = (ushort)intValue; bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold); } else if (datatype.Equals("uint32")) { ushort[] registerhold = new ushort[2]; int intValue = int.Parse(sValue); registerhold[1] = (ushort)(intValue >> 16); registerhold[0] = (ushort)intValue; bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold); } else if (datatype.Equals("int32")) { ushort[] registerhold = new ushort[2]; int intValue = int.Parse(sValue); registerhold[1] = (ushort)(intValue >> 16); registerhold[0] = (ushort)intValue; bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold); } break; } return(bok); }
void ReadModbusData(modbusrtu ModbusRtu, byte SlaveAddr, ushort ModbusAddr, DataType datatype, ushort nNumber, ref string[] sValue) { ushort ntype = (ushort)((ModbusAddr / 10000)); ushort naddr = (ushort)((ModbusAddr % 10000)); naddr = (ushort)(naddr - 1); switch (ntype) { case 0: //DO ushort[] coils = new ushort[nNumber]; bool bcoils = ModbusRtu.SendFc1(SlaveAddr, naddr, nNumber, ref coils); if (bcoils) { for (int i = 0; i < nNumber; i++) { sValue[i] = coils[i].ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } break; case 1: //DI ushort[] dis = new ushort[nNumber]; bool bdis = ModbusRtu.SendFc2(SlaveAddr, naddr, nNumber, ref dis); if (bdis) { for (int i = 0; i < nNumber; i++) { sValue[i] = dis[i].ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } break; case 4: //AO if (datatype.ToString().Equals("uint16")) { ushort[] registerhold = new ushort[nNumber]; bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, nNumber, ref registerhold); if (bhold) { for (int i = 0; i < nNumber; i++) { sValue[i] = registerhold[i].ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("int16")) { ushort[] registerhold = new ushort[nNumber]; bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, nNumber, ref registerhold); if (bhold) { for (int i = 0; i < nNumber; i++) { sValue[i] = ((short)registerhold[i]).ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("float")) { ushort[] registerhold = new ushort[2 * nNumber]; bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold); if (bhold) { for (int i = 0; i < nNumber; i++) { int intValue = (int)registerhold[i * 2 + 1]; intValue <<= 16; intValue += (int)registerhold[i * 2 + 0]; sValue[i] = BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0).ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("int32")) { ushort[] registerhold = new ushort[2 * nNumber]; bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold); if (bhold) { for (int i = 0; i < nNumber; i++) { int intValue = (int)registerhold[2 * i + 1]; intValue <<= 16; intValue += (int)registerhold[2 * i + 0]; sValue[i] = intValue.ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("uint32")) { ushort[] registerhold = new ushort[2 * nNumber]; bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold); if (bhold) { for (int i = 0; i < nNumber; i++) { UInt32 intValue = (UInt32)registerhold[2 * i + 1]; intValue <<= 16; intValue += (UInt32)registerhold[2 * i + 0]; sValue[i] = intValue.ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } break; case 3: //AI if (datatype.ToString().Equals("uint16")) { ushort[] registerinput = new ushort[nNumber]; bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, nNumber, ref registerinput); if (binput) { for (int i = 0; i < nNumber; i++) { sValue[i] = registerinput[i].ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("int16")) { ushort[] registerinput = new ushort[nNumber]; bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, nNumber, ref registerinput); if (binput) { for (int i = 0; i < nNumber; i++) { sValue[i] = ((short)registerinput[i]).ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("float")) { ushort[] registerinput = new ushort[2 * nNumber]; bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput); if (binput) { for (int i = 0; i < nNumber; i++) { int intValue = (int)registerinput[2 * i + 1]; intValue <<= 16; intValue += (int)registerinput[2 * i + 0]; sValue[i] = BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0).ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("int32")) { ushort[] registerinput = new ushort[2 * nNumber]; bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput); if (binput) { for (int i = 0; i < nNumber; i++) { int intValue = (int)registerinput[2 * i + 1]; intValue <<= 16; intValue += (int)registerinput[2 * i + 0]; sValue[i] = intValue.ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } else if (datatype.ToString().Equals("uint32")) { ushort[] registerinput = new ushort[2 * nNumber]; bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput); if (binput) { for (int i = 0; i < nNumber; i++) { UInt32 intValue = (UInt32)registerinput[2 * i + 1]; intValue <<= 16; intValue += (UInt32)registerinput[2 * i + 0]; sValue[i] = intValue.ToString(); } } else { for (int i = 0; i < nNumber; i++) { sValue[i] = "0"; } } } break; } }