111,098
社区成员




private void button1_Click(object sender, EventArgs e)
{
try
{
//初始化串口参数
InitSerialPortParameter();
master = ModbusSerialMaster.CreateRtu(port);
ExecuteFunction();
}
catch (Exception)
{
MessageBox.Show("初始化异常");
}
}
private async void ExecuteFunction()
{
String connetStr = "server=10.10.20.5;port=3309;user=root;password=rootqsr; database=db_qualitymanager;";
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
if (port.IsOpen == false)
{
port.Open();
}
if (functionCode != null)
{
switch (functionCode)
{
case "01 Read Coils"://读取单个线圈
//读取线圈
slaveAddress = byte.Parse("1");
startAddress = ushort.Parse("0");
numberOfPoints = ushort.Parse("20");
coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);
for (int i = 0; i < coilsBuffer.Length; i++)
{
bool m = coilsBuffer[i];//线圈状态
if (m == true)
#region
{
//读取寄存器
int j = i * 4 + 6;
startAddress1 = ushort.Parse(j+"");
numberOfPoints1 = ushort.Parse("3");
registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress1, numberOfPoints1);
string x = registerBuffer[0] + "";
string y = registerBuffer[2] + "";
if(x == "0")
{
continue;
}
else
{
if (i < 10)
{
string dpr = "z_0" + i;
conn.Open();
string today = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string sql = string.Format("insert into "+ dpr +"(vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改寄存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
await master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
}
else
{
string dpr = "z_" + i;
conn.Open();
string today = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string sql = string.Format("insert into " + dpr + " (vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改寄存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
await master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
}
}
#endregion
}
//SetMsg(coilsBuffer[i] + " ");
}
//SetMsg("\r\n");
break;
}
}
else
{
MessageBox.Show("请选择功能码!");
}
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int i;
private void button1_Click(object sender, EventArgs e)
{
i++;
//你会发现啥下面两个方法运行后,你会发现任务是交错进行的任务1,任务2完全是混乱的
//所以任务1运行完毕有可能会延后很长时间,所以按你的说法就是原本他应该执行,可是他的执行权被其他批次抢了,他永远在等待状态。所以你会发现结果上好像是他掉了
printTask(i);
// await printTask(i);
//在看改进方案,既然串口并发,当然我们要排队,不能让他们抢任务,一个任务就是一个任务,上一个任务执行完毕才会执行下一个任务,当然就你的东西来说,我们说理论上应该先操作串口再去写db,同时写db可以另外的task里写,尽量不要去占着串口操作时间,毕竟写db这种事情没有查串口那么重要
printTask1(i);
}
public async Task printTask(int i)
{
for (int j = 0; j < 100; j++)
{
Trace.WriteLine($"任务{i}-----value:{j}");
await Task.Delay(100);
}
}
private SemaphoreSlim slim = new SemaphoreSlim(1);
public async Task printTask1(int i)
{
await slim.WaitAsync();
for (int j = 0; j < 100; j++)
{
Trace.WriteLine($"任务改进{i}-----value:{j}");
await Task.Delay(100);
}
slim.Release();
}
}