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

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

@ -11,17 +11,18 @@ namespace EGFramework.Examples.Gateway{
public string SerialPort { set; get; } public string SerialPort { set; get; }
public byte Address { set; get; } public byte Address { set; get; }
public int BaudRate { 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 class DataModbusTCPDevice{
public string Host { set; get; } public string Host { set; get; }
public int Port { set; get; } public int Port { set; get; }
public byte Address { 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 Address { set; get; }
public ushort Length { set; get; }
public ModbusRegisterType RegisterType { set; get; } = ModbusRegisterType.HoldingRegister; public ModbusRegisterType RegisterType { set; get; } = ModbusRegisterType.HoldingRegister;
public string Name { set; get; } public string Name { set; get; }
// public string Unit { set; get; } // public string Unit { set; get; }

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

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

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

@ -292,6 +292,22 @@ namespace EGFramework {
} }
return floatArray; 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) public static double[] ToDoubleArray(this byte[] byteArray)
{ {
double[] doubleArray = new double[byteArray.Length / 8]; double[] doubleArray = new double[byteArray.Length / 8];

Loading…
Cancel
Save