private void Btn_send_Click(object sender, EventArgs e) { string addr = this.tb_register_address.Text; // 读取操作 //bool coil100 = busTcpClient.ReadCoil("100").Content; // 读取线圈100的通断 //short short100 = busTcpClient.ReadInt16(addr).Content; // 读取寄存器100的short值 //ushort ushort100 = busTcpClient.ReadUInt16(addr).Content; // 读取寄存器100的ushort值 //int int100 = busTcpClient.ReadInt32("100").Content; // 读取寄存器100-101的int值 //uint uint100 = busTcpClient.ReadUInt32(addr).Content; // 读取寄存器100-101的uint值 //float float100 = busTcpClient.ReadFloat("100").Content; // 读取寄存器100-101的float值 //long long100 = busTcpClient.ReadInt64("100").Content; // 读取寄存器100-103的long值 //ulong ulong100 = busTcpClient.ReadUInt64("100").Content; // 读取寄存器100-103的ulong值 //double double100 = busTcpClient.ReadDouble("100").Content; // 读取寄存器100-103的double值 //string str100 = busTcpClient.ReadString("100", 5).Content;// 读取100到104共10个字符的字符串 string len = this.tb_register_length.Text; ushort length = Convert.ToUInt16(len); if (length == 0) { MessageBox.Show("寄存器长度不能为0,请重新输入!"); return; } HslCommunication.OperateResult <byte[]> read = busTcpClient.Read(this.tb_register_address.Text, length); uint da = 0; string strMsg = ""; for (int i = 0; i < length; i++) { da = busTcpClient.ByteTransform.TransUInt16(read.Content, i * 2); strMsg += Convert.ToString(da, 2); } this.rtb_register_recive.Text = strMsg; }
private void Btn_discrete_send_Click(object sender, EventArgs e) { string len = this.tb_discrete_length.Text; ushort length = Convert.ToUInt16(len); if (length == 0) { MessageBox.Show("离散量长度不能为0,请重新输入!"); return; } HslCommunication.OperateResult <bool[]> read = busTcpClient.ReadDiscrete(this.tb_discrete_address.Text, length); string strMsg = ""; for (int i = 0; i < length; i++) { if (read.Content[i]) { strMsg += "1"; } else { strMsg += "0"; } } this.rtb_discrete_recive.Text = strMsg; }
private void userButton3_Click(object sender, EventArgs e) { // 远程通知服务器停止设备 HslCommunication.OperateResult <string, string> operate = mqttSyncClient.ReadString("StopPLC", ""); if (operate.IsSuccess) { MessageBox.Show(operate.Content1); } else { MessageBox.Show("通讯失败!" + operate.Message); } }
static void MelsecTest( ) { MelsecMcAsciiNet melsec = new MelsecMcAsciiNet("192.168.1.192", 6000); HslCommunication.OperateResult <short> read = melsec.ReadInt16("D100"); if (read.IsSuccess) { Console.WriteLine(read.Content); } else { Console.WriteLine(read.Message); } }
public ActionResult AdviceFeedback(string advice) { if (Request.IsAjaxRequest()) { //对建议进行保存 HslCommunication.OperateResult <string> result = UserClient.Net_simplify_client.ReadFromServer(CommonHeadCode.SimplifyHeadCode.意见反馈, UserClient.UserAccount.UserName + ":" + advice); if (result.IsSuccess) { return(PartialViewMessage(MessageBoxStyle.success, "建议提交成功!")); } else { return(PartialViewMessage(MessageBoxStyle.danger, result.Message)); } } else { return(PartialViewMessage(MessageBoxStyle.danger, "请求无效!")); } }
private void Time_cron_Tick(object sender, EventArgs e) { if (this.cb_cron_coil.Checked) { string len = this.tb_coil_length.Text; string strMsg = ""; ushort length = Convert.ToUInt16(len); if (length == 0) { MessageBox.Show("线圈长度不能为0,请重新输入!"); return; } HslCommunication.OperateResult <bool[]> read = busTcpClient.ReadCoil(this.tb_coil_address.Text, length); for (int i = 0; i < length; i++) { if (read.Content[i]) { strMsg += "1"; } else { strMsg += "0"; } } this.rtb_cron_data.Text += strMsg + "\n"; } if (this.cb_cron_register.Checked) { string addr = this.tb_register_address.Text; string len = this.tb_register_length.Text; ushort length = Convert.ToUInt16(len); if (length == 0) { MessageBox.Show("寄存器长度不能为0,请重新输入!"); return; } HslCommunication.OperateResult <byte[]> read = busTcpClient.Read(this.tb_register_address.Text, length); uint da = 0; string strMsg = ""; for (int i = 0; i < length; i++) { da = busTcpClient.ByteTransform.TransUInt16(read.Content, i * 2); strMsg += Convert.ToString(da, 2); } this.rtb_cron_data.Text += strMsg + "\n"; } if (this.cb_cron_discrete.Checked) { string len = this.tb_discrete_length.Text; ushort length = Convert.ToUInt16(len); if (length == 0) { MessageBox.Show("离散量长度不能为0,请重新输入!"); return; } HslCommunication.OperateResult <bool[]> read = busTcpClient.ReadDiscrete(this.tb_discrete_address.Text, length); string strMsg = ""; for (int i = 0; i < length; i++) { if (read.Content[i]) { strMsg += "1"; } else { strMsg += "0"; } } this.rtb_cron_data.Text += strMsg + "\n"; } }
//读写PLC2 1500的线程 private void ThreadBackgroundReadPlc2() { // 此处假设我们读取的是西门子PLC的数据,其实三菱的数据读取原理是一样的,可以仿照西门子的开发 while (true) { //触发事件 //EventArgs,写一个子类继承该类,子类中添加需要封装的数据信息,此处只需要传递string信息,详见MyEventArgs if (SendMsgEvent != null) { SendMsgEvent(this, new MyEventArg() { buffer1 = buffer1, strplc1 = "plc1", failed1 = failed1, buffer2 = buffer2, strplc2 = "plc2", failed2 = failed2_Read, userdata = Usertype }); } frmNewMain.bListenPlc2 = true; HslCommunication.OperateResult <JObject> read = null; // 这里仅仅演示了西门子的数据读取 HslCommunication.OperateResult <byte[]> buff = siemensTcpNet2_Read.Read("M500", 50); bool isSuccess2 = buff.IsSuccess; if (isSuccess2) { //首先返回一个读取成功的对象 read = HslCommunication.OperateResult.CreateSuccessResult(new JObject() { }); //PLC2访问成功 readPLC2Success = read.IsSuccess; ////临时用先清写指令区 //byte[] buffWrite_clear0 = new byte[10]; //OperateResult result0 = frmSieMens.siemensTcpNet2.Write("M510", buffWrite_clear0); //集合先清空 buffer2.Clear(); //读取回来的数据显示到txtbox //ShowReadContent(buff, "PLC2"); buffer2.AddRange(buff.Content);//将指定集合的元素添加到集合buffer的末尾 ///**************************SICK扫描数据**************************/ //Usertype.SICK_CastNumber = buff.Content[5]; //Usertype.SICK_CastType = buff.Content[6]; //Usertype.SICK_CastCentreX = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 7); //Usertype.SICK_CastCentreY = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 9); //Usertype.SICK_PoolLidHas = buff.Content[11]; /**************************PLC反馈数据**************************/ Usertype.PLC_Current_X = siemensTcpNet1.ByteTransform.TransUInt32(buff.Content, 0); Usertype.PLC_Current_Y = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 4); Usertype.PLC_Current_Z = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 6); Usertype.X_Arrive_Signal = buff.Content[10]; Usertype.Y_Arrive_Signal = buff.Content[11]; Usertype.Z_Arrive_Signal = buff.Content[12]; Usertype.Clamp_State = buff.Content[13]; //Usertype.Person_Confirm_PoolLid = buff.Content[36]; /**************************回读上位机写进PLC的数据**************************/ Usertype.ReadBack_Dest_X = siemensTcpNet1.ByteTransform.TransUInt32(buff.Content, 20); Usertype.ReadBack_Dest_Y = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 24); Usertype.ReadBack_Dest_Z = siemensTcpNet1.ByteTransform.TransUInt16(buff.Content, 26); Usertype.ReadBack_XEnable_Signal = buff.Content[30]; Usertype.ReadBack_YEnable_Signal = buff.Content[31]; Usertype.ReadBack_ZEnable_Signal = buff.Content[32]; Usertype.ReadBack_Catch_Release_Enable_Signal = buff.Content[34]; Usertype.ReadBack_Write_New_Flag = buff.Content[35]; if (frmNewMain.dataListrequest.Count == 0 && !frmNewMain.startExchageLib)//指令请求队列中没有任何指令时,且没有倒库任务时 { if (Start_system_flag == false) { //使能信号先清零 siemensTcpNet2_Read.Write("M530", 0x00); siemensTcpNet2_Read.Write("M531", 0x00); siemensTcpNet2_Read.Write("M532", 0x00); Start_system_flag = true; } } //初始位值到位,抱闸打开,开始 三个信号同时有 if (buffer2[14] == 0x01 && buffer2[15] == 0x01 && buffer2[16] == 0x01)//上位机收到PLC自动演示信号 { //开始将自动演示指令放进指令缓存区 string s1 = "01020201010102010000"; string s2 = "02020201010102010000"; string s3 = "04020401019999010000"; string sqlupdate = @"update 库存记录表 set 物料规格 = '卷筒', 物料状态 = '空卷', 检测状态 = NULL, 生产批号 = NULL where 物料状态 is not null"; if (frmNewMain.orderhas.Count == 0 && frmNewMain.dataListrequest.Count == 0) { SqlHelper.ExecuteNonQuery(sqlupdate); //首先将库中卷筒变为空卷 lock (locker) { frmNewMain.orderhas.Add("01", s1); frmNewMain.orderhas.Add("02", s2); frmNewMain.orderhas.Add("04", s3); } } //线程开启标志 Usertype.threadStart_flag = true; } else { //线程关闭 Usertype.threadStart_flag = false; //清空任务队列 lock (locker) { frmNewMain.orderhas.Clear(); frmNewMain.dataListrequest.Clear(); } } } else { read = HslCommunication.OperateResult.CreateFailedResult <JObject>(buff); } if (read.IsSuccess) { if (failed2_Read != 0)//断线重读成功 { failed2_Read = 0; //ShowFailedMessage(failed2, "执行动作PLC");//显示连接成功 } else { failed2_Read = 0; // 读取失败次数清空 } frmNewMain.bOpening2 = true; } else { frmNewMain.bOpening2 = false; failed2_Read++; //ShowFailedMessage(failed2, "执行动作PLC"); // 显示出来读取失败的情况 } Thread.Sleep(10); // 两次读取的时间间隔 } }
//读取PLC1 地面PLC的线程 private void ThreadBackgroundReadPlc1() { // 此处假设我们读取的是西门子PLC的数据,其实三菱的数据读取原理是一样的,可以仿照西门子的开发 while (true) { frmNewMain.bListenPlc1 = true; HslCommunication.OperateResult <JObject> read = null; // 这里仅仅演示了西门子的数据读取 HslCommunication.OperateResult <byte[]> buff = siemensTcpNet1.Read("M500", 50); ////读取字符串数据 //HslCommunication.OperateResult<string> strbuff = siemensTcpNet1.ReadString("M522", 10); bool isSuccess = buff.IsSuccess; if (isSuccess) { //首先返回一个读取成功的对象 read = HslCommunication.OperateResult.CreateSuccessResult(new JObject() { }); //访问成功 readPLC1Success = read.IsSuccess; //集合先清空 buffer1.Clear(); //读取回来的数据显示到txtbox //ShowReadContent(buff, "PLC1"); buffer1.AddRange(buff.Content); //将指定集合的元素添加到集合buffer的末尾 if (buffer1[3] == 0x01 && buffer1[0] != 0x00 && frmNewMain.startExchageLib == false) //有动作请求指令且没有倒库指令时 { byte[] data = new byte[10]; buffer1.CopyTo(0, data, 0, 10); //转换成字符串出掉末尾的\0\0\0 String d = frmNewMain.byteToHexStr(data).TrimEnd('\0'); //缓存中无相应工位的指令,且主队列中也没有相同的指令(避免同一位置下的重复指令)先将对应区域的指令放进字典中 if (!frmNewMain.orderhas.ContainsKey(buffer1[0].ToString("00")) && !frmNewMain.dataListrequest.Contains(d)) { lock (locker) { frmNewMain.orderhas.Add(buffer1[0].ToString("00"), d); } frmNewMain.bread = true; //将PLC请求指令区清零 byte[] buffWrite_clear = new byte[10]; OperateResult result1 = siemensTcpNet1.Write("M500", buffWrite_clear); } else //直接将PLC请求指令区清零 { byte[] buffWrite_clear = new byte[10]; OperateResult result1 = siemensTcpNet1.Write("M500", buffWrite_clear); } //退库自动出卷时需要判断MB514,MB515 if (buffer1[14] != 0x00) { autoGoodscode = buffer1[14].ToString("00"); } if (buffer1[15] == 0x01) { autoGoodssatate = "半卷"; } else if (buffer1[15] == 0x02) { autoGoodssatate = "满卷"; } } if (frmNewMain.orderhas.Count > 0) { //如果触摸屏有A1工位撤销指令状态过来,且此时字典中有指令 if (buffer1[10] != 0) { if (frmNewMain.orderhas.ContainsKey(buffer1[10].ToString())) { lock (locker) { frmNewMain.orderhas.Remove(buffer1[10].ToString());//移除对应项 } } siemensTcpNet1.Write("M510", 0); } //如果触摸屏有A2工位撤销指令状态过来,且此时字典中有指令 if (buffer1[11] != 0) { if (frmNewMain.orderhas.ContainsKey(buffer1[11].ToString())) { lock (locker) { frmNewMain.orderhas.Remove(buffer1[11].ToString());//移除对应项 } } siemensTcpNet1.Write("M511", 0); } //如果触摸屏有抽检工位撤销指令状态过来,且此时字典中有指令 if (buffer1[12] != 0) { if (frmNewMain.orderhas.ContainsKey(buffer1[12].ToString())) { lock (locker) { frmNewMain.orderhas.Remove(buffer1[12].ToString());//移除对应项 } } siemensTcpNet1.Write("M512", 0); } //如果触摸屏有B工位撤销指令状态过来,且此时字典中有对应工位的指令指令 if (buffer1[13] != 0) { if (frmNewMain.orderhas.ContainsKey(buffer1[13].ToString())) { lock (locker) { frmNewMain.orderhas.Remove(buffer1[13].ToString());//移除对应项 } } siemensTcpNet1.Write("M513", 0); } } else//字典中无指令时 { //清撤销指令状态区 byte[] order_clear = new byte[4]; siemensTcpNet1.Write("M510", order_clear); siemensTcpNet1.Write("M520", 0); siemensTcpNet1.Write("M521", 0); } //获取字符串 string strKT = Encoding.ASCII.GetString(buff.Content, 22, 10); } else { read = HslCommunication.OperateResult.CreateFailedResult <JObject>(buff); } if (read.IsSuccess) { if (failed1 != 0)//断线重读成功 { failed1 = 0; //ShowFailedMessage(failed1, "地面PLC");//显示连接成功 } else { failed1 = 0; // 读取失败次数清空 } frmNewMain.bOpening1 = true; } else { frmNewMain.bOpening1 = false; failed1++; //ShowFailedMessage(failed1, "地面PLC"); // 显示出来读取失败的情况 } Thread.Sleep(10); // 两次读取的时间间隔 } }
private void ThreadBackgroundReadPlc() { // 此处假设我们读取的是西门子PLC的数据,其实三菱的数据读取原理是一样的,可以仿照西门子的开发 /************************************************************************************************** * * 假设一:M100,M101存储了一个温度值,举例,100.5℃数据为1005 * 假设二:M102存储了设备启停信号,0为停止,1为启动 * 假设三:M103-M106存储了一个产量值,举例:12345678 * **************************************************************************************************/ double temperature = 100f; while (true) { if (isReadingPlc) { // 这里仅仅演示了西门子的数据读取 // 事实上你也可以改成三菱的,无非解析数据的方式不一致而已,其他数据推送代码都是一样的 HslCommunication.OperateResult <JObject> read = null; //siemensTcpNet.Read( "M100", 7 ); if (isReadRandom) { temperature = Math.Round(temperature + random.Next(100) / 10f - 5f, 1); if (temperature < 0 || temperature > 200) { temperature = 100; } // 当没有测试的设备的时候,此处就演示读取随机数的情况 read = HslCommunication.OperateResult.CreateSuccessResult(new JObject() { { "temp", new JValue(temperature) }, { "enable", new JValue(random.Next(100) > 10) }, { "product", new JValue(random.Next(10000)) } }); } else { HslCommunication.OperateResult <byte[]> tmp = siemensTcpNet.Read("M100", 7); if (tmp.IsSuccess) { double temp1 = siemensTcpNet.ByteTransform.TransInt16(tmp.Content, 0) / 10.0; bool machineEnable = tmp.Content[2] != 0x00; int product = siemensTcpNet.ByteTransform.TransInt32(tmp.Content, 3); read = HslCommunication.OperateResult.CreateSuccessResult(new JObject() { { "temp", new JValue(temp1) }, { "enable", new JValue(machineEnable) }, { "product", new JValue(product) } }); } else { read = HslCommunication.OperateResult.CreateFailedResult <JObject>(tmp); } } if (read.IsSuccess) { failed = 0; // 读取失败次数清空 pushServer.PushString("A", read.Content.ToString()); // 推送数据,关键字为A ShowReadContent(read.Content); // 在主界面进行显示,此处仅仅是测试,实际项目中不建议在服务端显示数据信息 } else { failed++; ShowFailedMessage(failed); // 显示出来读取失败的情况 } } Thread.Sleep(500); // 两次读取的时间间隔 } }