添加通过Modbus读取温湿度的设置

可通过用户界面调整地址
This commit is contained in:
CortexCore
2023-07-10 15:50:11 +08:00
parent 6301e2d3ad
commit d8d34766c0
6 changed files with 197 additions and 51 deletions

View File

@@ -210,25 +210,16 @@ public class IDIS_DBContext:DbContext
SaveChanges();
}
public void Update(string handle, string format, string value)
public bool Update(string handle, string format, string value)
{
// var datas =Datas.ToList();
// var result = datas.Where(x => x.Handle == handle && x.Format == format).ToArray();
// foreach (var x in result)
// {
// Datas.Remove(x);
// }
// foreach (var element in result)
// {
// element.Value = value;
// element.UpdateTime=DateTime.Now;
// Datas.Add(element);
// }
// SaveChanges();
var result = Datas.Single(x => x.Handle == handle && x.Format == format);
result.UpdateTime=DateTime.Now;
result.Value = value;
SaveChanges();
var result = Datas.FirstOrDefault(x => x.Handle == handle && x.Format == format);
if (result is not null)
{
result.UpdateTime=DateTime.Now;
result.Value = value;
SaveChanges();
}
return result is not null;
}
}
// ReSharper disable once IdentifierTypo
@@ -250,5 +241,5 @@ public partial class IDIS_Service:Node
public void RegisterReference(string handle,string refenceHandle) => Context.RegisterReference(handle,refenceHandle);
public static string GenerateHandle() => $"88.123.99/{Mathf.Abs(Guid.NewGuid().GetHashCode())}";
public bool Query(string key, out IDIS_Query query) => Context.Query(key, out query);
public void Update(string handle, string format, string value) => Context.Update(handle, format, value);
public bool Update(string handle, string format, string value) => Context.Update(handle, format, value);
}

View File

@@ -12,17 +12,37 @@ public partial class IDIS_UpdateService : Node
[Export] private LineEdit handleEdit;
[Export] private LineEdit temperatureEdit;
[Export] private LineEdit humidityEdit;
[Export] private Label hintsLabel;
[Export] private RichTextLabel hintsLabel;
public override void _Ready()
{
submitButton.Pressed += Submit;
}
private void Submit()
{
switch (handleEdit.Text, temperatureEdit.Text, humidityEdit.Text)
{
case ("", _, _):
hintsLabel.Text = "请输入标识码";
return;
case (_, "", _):
hintsLabel.Text = "请输入温度";
return;
case (_, _, ""):
hintsLabel.Text = "请输入湿度";
return;
}
try
{
service.Update(handleEdit.Text, "温度", humidityEdit.Text);
service.Update(handleEdit.Text, "湿度", temperatureEdit.Text);
if (service.Update(handleEdit.Text, "温度", humidityEdit.Text) is false)
{
hintsLabel.Text = "温度更新失败: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return;
}
if (service.Update(handleEdit.Text, "湿度", temperatureEdit.Text) is false)
{
hintsLabel.Text = "湿度更新失败: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return;
}
hintsLabel.Text = "更新成功: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
catch (Exception e)
@@ -30,6 +50,5 @@ public partial class IDIS_UpdateService : Node
hintsLabel.Text = e.Message;
throw;
}
}
}

View File

@@ -1,7 +1,10 @@
using Godot;
using System;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using BITKit;
using Cysharp.Threading.Tasks;
using SharpModbus;
using Timer = System.Timers.Timer;
@@ -21,8 +24,11 @@ public partial class 温湿度Reader : Node
[Export]public double temperature = 26.0;
[ExportCategory("UI 绑定")]
[Export] private Label temperatureLabel;
[Export] private Label humidityLabel;
[Export] private UXContainer temperatureContaier;
[Export] private UXContainer humidityContainer;
[Export] private LineEdit ipEdit;
[Export] private LineEdit portEdit;
[Export] private RichTextLabel hintsLabel;
private ModbusMaster _modbus;
private System.Timers.Timer timer;
@@ -30,7 +36,37 @@ public partial class 温湿度Reader : Node
public override void _Ready()
{
_CancellationTokenSource = new CancellationTokenSource();
_modbus = ModbusMaster.TCP(ip, port);
try
{
_modbus = ModbusMaster.TCP(ip, port);
}
catch (Exception e)
{
hintsLabel.Text = e.Message;
}
if (ipEdit is not null)
{
ipEdit.TextChanged += s => ip = s;
ipEdit.TextSubmitted +=s=> UpdatePortAndIP();
}
if(portEdit is not null)
{
portEdit.TextSubmitted += OnPortChanged;
void OnPortChanged(string s)
{
UpdatePortAndIP();
if (int.TryParse(s,out var newPort))
{
}
else
{
portEdit.Text=string.Empty;
portEdit.PlaceholderText = "请输入正确的端口号";
}
}
}
timer = new Timer();
timer.Interval = interval;
@@ -43,9 +79,16 @@ public partial class 温湿度Reader : Node
{
timer.Stop();
}
private void UpdatePortAndIP()
{
_modbus.Dispose();
_modbus = ModbusMaster.TCP(ip, port);
}
private async void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
SetHints( "正在获取温湿度数据..."+DateTime.Now);
_CancellationTokenSource.Cancel();
await UniTask.SwitchToTaskPool();
try
@@ -56,16 +99,35 @@ public partial class 温湿度Reader : Node
_CancellationTokenSource.Token.ThrowIfCancellationRequested();
if (vs is not { Length: 2 }) return;
if (vs is not { Length: 2 })
{
SetHints(hintsLabel.Text = $"获取温湿度数据失败:数据长度为:{vs.Length}"+DateTime.Now);
return;
}
temperature = vs[0] / 10.0;
humidity = vs[1] / 10.0;
SetHints("已获取到温湿度数据:"+DateTime.Now);
temperatureContaier.Text = temperature.ToString(CultureInfo.InvariantCulture);
humidityContainer.Text = humidity.ToString(CultureInfo.InvariantCulture);
}
catch (OperationCanceledException)
{
//SetHints("连接超时:"+DateTime.Now);
}
catch (Exception ex)
{
SetHints(ex.Message);
GD.Print("ex:" + ex);
}
}
private async void SetHints(string hints)
{
await UniTask.SwitchToSynchronizationContext(BITApp.SynchronizationContext);
hintsLabel.Text = hints;
}
}