Exemple #1
0
        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;
        }
Exemple #2
0
        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;
        }
Exemple #3
0
 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);
     }
 }
Exemple #4
0
        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, "请求无效!"));
     }
 }
Exemple #6
0
        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";
            }
        }
Exemple #7
0
        //读写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);              // 两次读取的时间间隔
            }
        }
Exemple #8
0
        //读取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);                      // 两次读取的时间间隔
            }
        }
Exemple #9
0
        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);                            // 两次读取的时间间隔
            }
        }