Skip to content

Commit 635823a

Browse files
committed
Made poller delay thread safe
- added property for currentlly queued messages - added (optional) progress to ReadByteRange
1 parent c7a6559 commit 635823a

File tree

5 files changed

+107
-49
lines changed

5 files changed

+107
-49
lines changed

Examples/Program.cs

Lines changed: 84 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ static void Main(string[] args) {
2727
Console.ReadLine();
2828
}
2929

30+
private static bool isProgressReadout = false;
31+
3032
static void Scenario1 () {
3133

3234
Task.Factory.StartNew(async () => {
@@ -46,76 +48,115 @@ static void Scenario1 () {
4648

4749
_ = Task.Factory.StartNew(async () => {
4850
while (true) {
49-
Console.Title = $"Polling Paused: {interf.PollingPaused}, Speed UP: {interf.BytesPerSecondUpstream} B/s, Speed DOWN: {interf.BytesPerSecondDownstream} B/s";
51+
if (isProgressReadout) continue;
52+
Console.Title = $"Polling Paused: {interf.PollingPaused}, " +
53+
$"Speed UP: {interf.BytesPerSecondUpstream} B/s, " +
54+
$"Speed DOWN: {interf.BytesPerSecondDownstream} B/s, " +
55+
$"Poll delay: {interf.PollerDelayMs} ms, " +
56+
$"Queued MSGs: {interf.QueuedMessages}";
5057
await Task.Delay(1000);
5158
}
5259
});
5360

54-
await interf.ConnectAsync(
55-
(plcinf) => {
61+
await interf.ConnectAsync((plcinf) => AfterConnect(interf, registers));
5662

57-
//reading a value from the register collection
58-
Console.WriteLine($"BitValue is: {registers.BitValue}");
59-
Console.WriteLine($"TestEnum is: {registers.TestEnum}");
63+
});
6064

61-
//writing a value to the registers
62-
Task.Factory.StartNew(async () => {
65+
}
6366

64-
//set plc to run mode if not already
65-
await interf.SetOperationMode(OPMode.Run);
67+
static void AfterConnect (MewtocolInterface interf, TestRegisters registers) {
6668

69+
//reading a value from the register collection
70+
Console.WriteLine($"BitValue is: {registers.BitValue}");
71+
Console.WriteLine($"TestEnum is: {registers.TestEnum}");
6772

68-
int startAdress = 10000;
69-
int entryByteSize = 20 * 20;
73+
_ = Task.Factory.StartNew(async () => {
7074

71-
var bytes = await interf.ReadByteRange(startAdress, entryByteSize);
72-
Console.WriteLine($"Bytes: {string.Join('-', bytes)}");
75+
while(true) {
7376

74-
await Task.Delay(2000);
77+
isProgressReadout = true;
7578

76-
await interf.SetRegisterAsync(nameof(registers.TestInt32), 100);
79+
await interf.ReadByteRange(1000, 2000, (p) => {
7780

78-
//adds 10 each time the plc connects to the PLCs INT regíster
79-
interf.SetRegister(nameof(registers.TestInt16), (short)(registers.TestInt16 + 10));
80-
//adds 1 each time the plc connects to the PLCs DINT regíster
81-
interf.SetRegister(nameof(registers.TestInt32), (registers.TestInt32 + 1));
82-
//adds 11.11 each time the plc connects to the PLCs REAL regíster
83-
interf.SetRegister(nameof(registers.TestFloat32), (float)(registers.TestFloat32 + 11.11));
84-
//writes 'Hello' to the PLCs string register
85-
interf.SetRegister(nameof(registers.TestString2), "Hello");
86-
//set the current second to the PLCs TIME register
87-
interf.SetRegister(nameof(registers.TestTime), TimeSpan.FromSeconds(DateTime.Now.Second));
81+
var totSteps = 10;
82+
var cSteps = totSteps * p;
8883

89-
//test pausing poller
84+
string progBar = "";
85+
for (int i = 0; i < totSteps; i++) {
9086

91-
bool pollerPaused = false;
87+
if(i < (int)cSteps) {
88+
progBar += "⬛";
89+
} else {
90+
progBar += "⬜";
91+
}
92+
93+
}
9294

93-
while(true) {
95+
Console.Title = $"Prog read range: {(p * 100).ToString("N1")}% {progBar} Queued MSGs: {interf.QueuedMessages}";
9496

95-
await Task.Delay(5000);
97+
});
9698

97-
pollerPaused = !pollerPaused;
99+
isProgressReadout = false;
98100

99-
if(pollerPaused) {
100-
Console.WriteLine("Pausing poller");
101-
await interf.PausePollingAsync();
102-
Console.WriteLine("Paused poller");
103-
} else {
104-
interf.ResumePolling();
105-
Console.WriteLine("Resumed poller");
106-
}
101+
await Task.Delay(3000);
107102

108-
}
103+
}
104+
105+
});
106+
107+
//writing a value to the registers
108+
_ = Task.Factory.StartNew(async () => {
109+
110+
//set plc to run mode if not already
111+
await interf.SetOperationMode(OPMode.Run);
112+
113+
int startAdress = 10000;
114+
int entryByteSize = 20 * 20;
109115

116+
var bytes = await interf.ReadByteRange(startAdress, entryByteSize);
117+
Console.WriteLine($"Bytes: {string.Join('-', bytes)}");
110118

111-
});
119+
await Task.Delay(2000);
112120

121+
await interf.SetRegisterAsync(nameof(registers.TestInt32), 100);
122+
123+
//adds 10 each time the plc connects to the PLCs INT regíster
124+
interf.SetRegister(nameof(registers.TestInt16), (short)(registers.TestInt16 + 10));
125+
//adds 1 each time the plc connects to the PLCs DINT regíster
126+
interf.SetRegister(nameof(registers.TestInt32), (registers.TestInt32 + 1));
127+
//adds 11.11 each time the plc connects to the PLCs REAL regíster
128+
interf.SetRegister(nameof(registers.TestFloat32), (float)(registers.TestFloat32 + 11.11));
129+
//writes 'Hello' to the PLCs string register
130+
interf.SetRegister(nameof(registers.TestString2), "Hello");
131+
//set the current second to the PLCs TIME register
132+
interf.SetRegister(nameof(registers.TestTime), TimeSpan.FromSeconds(DateTime.Now.Second));
133+
134+
//test pausing poller
135+
136+
bool pollerPaused = false;
137+
138+
while (true) {
139+
140+
await Task.Delay(5000);
141+
142+
pollerPaused = !pollerPaused;
143+
144+
if (pollerPaused) {
145+
Console.WriteLine("Pausing poller");
146+
await interf.PausePollingAsync();
147+
//interf.PollerDelayMs += 10;
148+
Console.WriteLine("Paused poller");
149+
} else {
150+
interf.ResumePolling();
151+
Console.WriteLine("Resumed poller");
113152
}
114-
);
153+
154+
}
155+
115156

116157
});
117158

118-
}
159+
}
119160

120161
static void Scenario2 () {
121162

MewtocolNet/Mewtocol/DynamicInterface.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ internal void AttachPoller () {
168168

169169
iteration++;
170170

171-
await Task.Delay(PollerDelayMs);
171+
await Task.Delay(pollerDelayMs);
172172

173173
}
174174

MewtocolNet/Mewtocol/MewtocolInterface.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,24 @@ public int ConnectTimeout {
5252
set { connectTimeout = value; }
5353
}
5454

55-
private int pollerDelayMs = 0;
55+
private volatile int pollerDelayMs = 0;
5656
/// <summary>
5757
/// Delay for each poller cycle in milliseconds, default = 0
5858
/// </summary>
5959
public int PollerDelayMs {
60-
get { return pollerDelayMs; }
61-
set { pollerDelayMs = value; }
60+
get => pollerDelayMs;
61+
set {
62+
pollerDelayMs = value;
63+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PollerDelayMs)));
64+
}
65+
}
66+
67+
private volatile int queuedMessages;
68+
/// <summary>
69+
/// Currently queued Messages
70+
/// </summary>
71+
public int QueuedMessages {
72+
get => queuedMessages;
6273
}
6374

6475
/// <summary>
@@ -721,7 +732,9 @@ public async Task<CommandResult> SendCommandAsync (string _msg) {
721732
//send request
722733
try {
723734

735+
queuedMessages++;
724736
var response = await queue.Enqueue(() => SendSingleBlock(_msg));
737+
queuedMessages--;
725738

726739
if (response == null) {
727740
return new CommandResult {

MewtocolNet/Mewtocol/MewtocolInterfaceRequests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ public async Task<bool> WriteByteRange (int start, byte[] byteArr) {
112112
/// </summary>
113113
/// <param name="start">Start adress</param>
114114
/// <param name="count">Number of bytes to get</param>
115+
/// <param name="onProgress">Gets invoked when the progress changes, contains the progress as a double</param>
115116
/// <returns>A byte array or null of there was an error</returns>
116-
public async Task<byte[]> ReadByteRange (int start, int count) {
117+
public async Task<byte[]> ReadByteRange (int start, int count, Action<double> onProgress = null) {
117118

118119
var byteList = new List<byte>();
119120

@@ -146,6 +147,9 @@ public async Task<byte[]> ReadByteRange (int start, int count) {
146147

147148
}
148149

150+
if(onProgress != null)
151+
onProgress((double)i / wordLength);
152+
149153
}
150154

151155
return byteList.ToArray();

MewtocolNet/MewtocolNet.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<TargetFramework>netstandard2.0</TargetFramework>
44
<PackageId>MewtocolNet</PackageId>
5-
<Version>0.5.6</Version>
5+
<Version>0.5.7</Version>
66
<Authors>Felix Weiss</Authors>
77
<Company>Womed</Company>
88
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

0 commit comments

Comments
 (0)