你好,我在我的Blazor服务器应用程序中使用了第三方dll。此dll用于连接到远程PLC并读取它们的PLC数据。数据读取方法(doNCK_ReadMixEx)只适用于静态变量(否则读取不起作用)--我在源服务中使用了这种方法,因此每个客户端都应该能够同时(每秒钟)从不同的PLC读取数据。如果只有一个客户端正在从远程PLC读取数据,那么它的工作非常好。但是,如果两个客户端同时尝试从不同的PLC读取数据,数据就会被读取,但我经常看到的不是所需的数据,而是不同的字符或数字。我不确定我在调用该方法时是否有问题,或者该方法的静态变量是否导致了这个问题。这是我的代码:
剃须刀页(这里我正在触发期刊阅读)
@page "/PLC_Status"
@inject Deltalogic Deltalogic
@inject Parameter_840D Parameter_840D
<button @onclick="Read_CNC_Status">Start Reading</button>Razor.cs
public async Task Read_CNC_Status()
{
Reading_active = true;
for (int k=0; k<=200;k++)
{
Read_PLC_Data();
InvokeAsync(() =>
{
StateHasChanged();
});
await Task.Delay(1000);
if (k == 200)
{
Stop_CNC_Status();
}
}
}
}
public void Read_PLC_Data()
//Here the doNCK_ReadMixEx is called for each PLC parameter
{
Parameter_840D.Par_840D_Channel_Status(Deltalogic.channel_no); //Pick-up parameters for variable-1
Deltalogic.doNCK_ReadMixEx(Deltalogic.MAE_Status_DevNr, 5000, out Deltalogic.MAE_Status_Mode)
Parameter_840D.Par_840D_Prog_Status(Deltalogic.channel_no); //Pick-up parameters for variable-2
Deltalogic.doNCK_ReadMixEx(Deltalogic.MAE_Status_DevNr, 5000, out Deltalogic.MAE_Status_State_CH[1);
Parameter_840D.Par_840D_Machine_Active_Workpiece(Deltalogic.channel_no);//Pick-up parameters for variable-3
Deltalogic.doNCK_ReadMixEx(Deltalogic.MAE_Status_DevNr, 5000, out Deltalogic.MAE_Status_WPD_CH[Deltalogic.channel_no]);
// and other PLC parameters....
}Parameter_840D (doNCK_ReadMixEx参数化的源服务)
// The parameters of doNCK_ReadMixEx have to be defined as static. If not, data cannot be read
public class Parameter_840D
{
[Inject]
Deltalogic Deltalogic { get; set; }
public static byte channel_no = 1;
public static ushort Parameter_No;
public static ushort column;
public static AGL4.NCK_Block block_type;
public static AGL4.NCK_Area area;
public static ushort row;
public static byte rowCount;
public static byte Unit;
public static int Bufflen;
public static byte Buff;
public static AGL4.NCK_DDEVarFormat DD
//Methods that just describes the parameter for each PLC variable}
Deltalogic ( PLC阅读方法的来源服务)
public class Deltalogic
{
[Inject]
Parameter_840D Parameter_840D { get; set; }
public Int32 doNCK_ReadMixEx(Int32 connnr, Int32 timeout, out string NCK_Data)
{
//Reset_Parameter_value();
NCK_Data = "";
Parameter_840D Parameter_840D = new Parameter_840D();
connnr = Return_Connect_NCK;
Int32 result = 0;
AGL4.NckDataRW[] rwfield = new AGL4.NckDataRW[1];
rwfield[0] = new AGL4.NckDataRW();
rwfield[0].Area = Parameter_840D.area;
rwfield[0].Block = Parameter_840D.block_type;
rwfield[0].Column = Parameter_840D.column;
rwfield[0].Row = Parameter_840D.row;
rwfield[0].RowCount = Parameter_840D.rowCount;
rwfield[0].Unit = Parameter_840D.Unit;
rwfield[0].DDEVarType = Parameter_840D.DDEVarType;
rwfield[0].BuffLen = Parameter_840D.Bufflen;
rwfield[0].Buff = new Byte[rwfield[0].BuffLen];
rwfield[0].Result = 0;
result = AGL4.NCK_ReadMixEx(connnr, ref rwfield, timeout);
}发布于 2022-08-04 12:37:20
您希望创建一个包装器服务,并使其线程安全。如果代码不是异步的,可以用lock{...}语句来完成这一任务。如果是异步的,则可以使用SemaphoreSlim锁定资源,以便同时只允许可配置的线程数量;您希望将其配置为1。
https://stackoverflow.com/questions/73235889
复制相似问题