bro how tf did I make this work before

This commit is contained in:
nikzori
2025-01-21 14:38:59 +03:00
parent d70e5b155e
commit cce7b2295c
4 changed files with 277 additions and 176 deletions

View File

@@ -20,10 +20,18 @@ namespace Gidrolock_Modbus_Scanner
byte modbusID;
Device device;
byte[] message;
byte[] data;
EventHandler<ModbusResponseEventArgs> handler;
SerialPort port = Modbus.port;
bool isPolling = false;
bool isAwaitingResponse = false;
byte[] message = new byte[255];
bool isValveClosed = false;
bool alarmStatus = false;
bool cleaningStatus = false;
public Datasheet(byte modbusID, Device device)
{
@@ -31,33 +39,80 @@ namespace Gidrolock_Modbus_Scanner
nudModbusID.Maximum = 246;
this.modbusID = modbusID;
this.device = device;
if (!device.hasCleaningMode)
{
labelCleaning.Text = "Недоступна.";
buttonCleaning.Enabled = false;
}
handler = (sndr, msg) =>
{
message = msg.Message;
data = msg.Data;
};
}
private async void buttonPoll_Click(object sender, EventArgs e)
{
// hardcoded for now, probably easier to keep it like this in the future
if (await PollEntry(device.valveStatus))
{
if (data.Last() > 0)
labelValve.Text = "Закрыт";
else labelValve.Text = "Открыт";
}
}
async Task<bool> PollEntry(Entry entry)
{
var send = Modbus.ReadRegAsync(modbusID, (FunctionCode)entry.registerType, entry.address, entry.length);
isAwaitingResponse = true;
Task<bool> delay = Task.WhenAny(Task.Delay(2000), Task.Run(() => { while (isAwaitingResponse) { } return true; })).ContinueWith((t) =>
{
if (isAwaitingResponse)
{
Console.WriteLine("Response timed out.");
isAwaitingResponse = false;
}
return false;
});
return await delay;
}
private async void buttonSetID_Click(object sender, EventArgs e)
{
Modbus.WriteSingleAsync(FunctionCode.WriteRegister, modbusID, 200, (byte)nudModbusID.Value);
byte[] data = null;
Modbus.ResponseReceived += (sndr, msg) =>
{
data = msg.Data;
};
await Task.Run(() =>
{
while (data is null) { continue; }
if (message[1] > 0x10) //exception code check
return;
this.modbusID = data[1]; //no exception, can just take the byte
message = null;
data = null;
});
}
private void buttonValve_Click(object sender, EventArgs e)
{
ushort value = isValveClosed ? (ushort)0 : (ushort)1;
Modbus.WriteSingleAsync((FunctionCode)device.valveStatus.registerType, modbusID, device.valveStatus.address, value);
}
private void buttonAlarm_Click(object sender, EventArgs e)
{
ushort value = alarmStatus ? (ushort)0 : (ushort)1;
Modbus.WriteSingleAsync((FunctionCode)device.valveStatus.registerType, modbusID, device.alarmStatus.address, value);
}
private void buttonCleaning_Click(object sender, EventArgs e)
{
}
}
}