Browse Source

modbus tcp function added

master
Z 1 year ago
parent
commit
d1d89c1a17
  1. 2
      Example/Gateway/ModbusGateway.tscn
  2. 7
      Example/Gateway/Script/Data/DataModbusGatewaySettings.cs
  3. 22
      Example/Gateway/Script/View/ViewModbusGateway.cs
  4. 16
      addons/EGFramework/Module/Extension/EGConvertExtension.cs

2
Example/Gateway/ModbusGateway.tscn

@ -3,7 +3,6 @@ @@ -3,7 +3,6 @@
[ext_resource type="Script" path="res://Example/Gateway/Script/View/ViewModbusGateway.cs" id="1_34uaa"]
[node name="ModbusGateway" type="Control"]
visible = false
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@ -14,5 +13,6 @@ script = ExtResource("1_34uaa") @@ -14,5 +13,6 @@ script = ExtResource("1_34uaa")
[node name="Timer" type="Timer" parent="."]
wait_time = 2.0
autostart = true
[connection signal="timeout" from="Timer" to="." method="PushDataToGateway"]

7
Example/Gateway/Script/Data/DataModbusGatewaySettings.cs

@ -11,17 +11,18 @@ namespace EGFramework.Examples.Gateway{ @@ -11,17 +11,18 @@ namespace EGFramework.Examples.Gateway{
public string SerialPort { set; get; }
public byte Address { set; get; }
public int BaudRate { set; get; }
public Dictionary<string,DataModbusRegister> Registers = new Dictionary<string, DataModbusRegister>();
public Dictionary<string,DataModbusValue> ValueRegisters = new Dictionary<string, DataModbusValue>();
}
public class DataModbusTCPDevice{
public string Host { set; get; }
public int Port { set; get; }
public byte Address { set; get; }
public Dictionary<string,DataModbusRegister> Registers = new Dictionary<string, DataModbusRegister>();
public Dictionary<string,DataModbusValue> ValueRegisters = new Dictionary<string, DataModbusValue>();
}
public class DataModbusRegister{
public class DataModbusValue{
public ushort Address { set; get; }
public ushort Length { set; get; }
public ModbusRegisterType RegisterType { set; get; } = ModbusRegisterType.HoldingRegister;
public string Name { set; get; }
// public string Unit { set; get; }

22
Example/Gateway/Script/View/ViewModbusGateway.cs

@ -24,8 +24,7 @@ namespace EGFramework.Examples.Gateway{ @@ -24,8 +24,7 @@ namespace EGFramework.Examples.Gateway{
// double t = 54.32f;
// GD.Print(BitConverter.GetBytes(fData.ToDoubleArray()[0]).ToStringByHex());
// byte[] fData = {0x42,0x0D,0x33,0x33};
// GD.Print(fData.Reverse().ToFloatArray()[0]);
// GD.Print(fData.ToFloatArrayBigEndian()[0]);
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
@ -55,11 +54,24 @@ namespace EGFramework.Examples.Gateway{ @@ -55,11 +54,24 @@ namespace EGFramework.Examples.Gateway{
Address = 0x01,
BaudRate = 9600
});
Setting.Devices485["COM4"].Registers.Add("表头读数",new DataModbusRegister(){
Setting.Devices485["COM4"].ValueRegisters.Add("表头读数",new DataModbusValue(){
Address = 0x00,
Length = 0x01,
RegisterType = ModbusRegisterType.HoldingRegister,
Name = "表头读数"
});
string IpPort = "192.168.1.170:8234";
Setting.DevicesTCP.Add(IpPort,new DataModbusTCPDevice(){
Host = IpPort.GetHostByIp(),
Port = IpPort.GetPortByIp(),
Address = 0x01
});
Setting.DevicesTCP[IpPort].ValueRegisters.Add("温度",new DataModbusValue(){
Address = 0x04B0,
Length = 0x01,
RegisterType = ModbusRegisterType.HoldingRegister,
Name = "温度"
});
}
public async void PushDataToGateway(){
@ -68,8 +80,8 @@ namespace EGFramework.Examples.Gateway{ @@ -68,8 +80,8 @@ namespace EGFramework.Examples.Gateway{
}
JObject pushData = new JObject();
foreach(KeyValuePair<string,DataModbus485Device> device485 in Setting.Devices485){
foreach(KeyValuePair<string,DataModbusRegister> register in Setting.Devices485[device485.Key].Registers){
ModbusRTU_Response? result = await this.EGModbus().ReadRTUAsync(register.Value.RegisterType,device485.Key,device485.Value.Address,register.Value.Address,0x01);
foreach(KeyValuePair<string,DataModbusValue> register in Setting.Devices485[device485.Key].ValueRegisters){
ModbusRTU_Response? result = await this.EGModbus().ReadRTUAsync(register.Value.RegisterType,device485.Key,device485.Value.Address,register.Value.Address,register.Value.Length);
if(result != null){
if(!((ModbusRTU_Response)result).IsError){
if(register.Value.RegisterType == ModbusRegisterType.HoldingRegister){

16
addons/EGFramework/Module/Extension/EGConvertExtension.cs

@ -292,6 +292,22 @@ namespace EGFramework { @@ -292,6 +292,22 @@ namespace EGFramework {
}
return floatArray;
}
public static float[] ToFloatArrayBigEndian(this byte[] byteArray)
{
float[] floatArray = new float[byteArray.Length / 4];
for (int i = 0; i < floatArray.Length; i++)
{
byte[] tempArray = new byte[4];
Array.Copy(byteArray, i * 4, tempArray, 0, 4);
if(BitConverter.IsLittleEndian){
Array.Reverse(tempArray);
}
//Array.Reverse(tempArray);
floatArray[i] = BitConverter.ToSingle(tempArray, 0);
}
return floatArray;
}
public static double[] ToDoubleArray(this byte[] byteArray)
{
double[] doubleArray = new double[byteArray.Length / 8];

Loading…
Cancel
Save