Exemple #1
0
        void cleanQuery()
        {
            // вначале разбираем очередь на запись
            writeComm wr;

            // создание дубликата writeQuveryDuble и освобождение исходной коллеции
            List <writeComm> writeQuveryDuble = new List <writeComm>();

            lock (block)
            {
                for (int i = 0; i < writeQuvery.Count; i++)
                {
                    writeQuveryDuble.Add(writeQuvery[i]);
                }
                writeQuvery.Clear();
            } //lock

            try
            {
                for (int i = 0; i < writeQuveryDuble.Count; i++)
                {
                    wr = writeQuveryDuble[i];
                    if (wr.reg == 0)
                    {
                        if (wr.len == 1)
                        {
                            master.WriteSingleCoil(wr.address, (bool)wr.value);
                        }
                        else
                        {
                            bool[] b = (bool[])wr.value;
                            master.WriteMultipleCoils(wr.address, b);
                        }
                    }
                    if (wr.reg == 3)
                    {
                        if (wr.type == 2 || wr.type == 3) //2 байтный int
                        {
                            if (wr.len == 1)
                            {
                                master.WriteSingleRegister(wr.address, BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0));
                            }
                            else
                            {
                                ushort[] b = (ushort[])wr.value;
                                master.WriteMultipleRegisters(wr.address, b);
                            }
                        }
                        if (wr.type >= 4 && wr.type <= 7) //4 байтный int
                        {
                            if (wr.len == 1)
                            {
                                ushort[] b = new ushort[2];
                                b[0] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0);
                                b[1] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 2);
                                master.WriteMultipleRegisters(wr.address, b);
                            }
                            else
                            {
                                int[] b = (int[])wr.value;
                                for (ushort j = 0; j < wr.len; j++)
                                {
                                    ushort[] bb = new ushort[2];
                                    bb[0] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 0);
                                    bb[1] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 2);
                                    master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bb);
                                }
                            }
                        }
                        if (wr.type >= 8 && wr.type <= 9) //4 байтный float
                        {
                            if (wr.len == 1)
                            {
                                byte[]   b  = BitConverter.GetBytes((float)wr.value);
                                ushort[] bb = new ushort[2];
                                bb[0] = BitConverter.ToUInt16(b, 0);
                                bb[1] = BitConverter.ToUInt16(b, 2);
                                master.WriteMultipleRegisters(wr.address, bb);
                            }
                            else
                            {
                                float[] bb = (float[])wr.value;
                                for (int j = 0; j < wr.len; j++)
                                {
                                    byte[]   b   = BitConverter.GetBytes(bb[j]);
                                    ushort[] bbb = new ushort[2];
                                    bbb[0] = BitConverter.ToUInt16(b, 0);
                                    bbb[1] = BitConverter.ToUInt16(b, 2);
                                    master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bbb);
                                }
                            }
                        } //if
                    }     //if
                }         //for
            }
            catch (Exception err)
            {
                Util.errorTCP();
                Util.errorMessage(err.Message, description);
                device.status = err.HResult;
                device.ready  = false; //??????????????????????????????/
            }
            //writeQuvery.Clear();
        }
Exemple #2
0
        public void Tomodbus()
        {
            this.timerModbus.Stop();
            try
            {
                int port = Convert.ToInt32(Pub_dtTSetting.Rows[0][4]); //<--- This is your value
                // define array to keep address Input Register---------------------------------------
                int tagB = 0;
                for (int row = 0; row < Pub_dtTTAGMapping.Rows.Count; row++)
                {
                    string tagtype = dataGridView1.Rows[row].Cells[6].Value.ToString();//TagType
                    if (tagtype == "B")
                    {
                        tagB++;
                    }
                }
                int[][] mosbusAdrInputRegister = new int[tagB][];
                for (int index1 = 0; index1 < tagB; index1++)
                {
                    mosbusAdrInputRegister[index1] = new int[2];
                }
                //-----------------------------------------------------------------------------------
                //IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
                foreach (var ip in host.AddressList)
                {
                    if (ip.AddressFamily == AddressFamily.InterNetwork)
                    {
                        using (TcpClient tcpClient = new TcpClient())
                        {
                            tcpClient.Connect(ip.ToString(), port); //if port 502 open, server not start throw exception
                            ModbusIpMaster master2Family = ModbusIpMaster.CreateIp(tcpClient);

                            int    Count_Boolean             = 0;
                            bool[] boolvalueto_inputRegister = new bool[dataGridView1.Rows.Count];
                            slave2Family.DataStore.InputDiscretes.Clear(); // clear Input Status for manual add
                            for (int row = 0; row < Pub_dtTTAGMapping.Rows.Count; row++)
                            {
                                string Mb_Address = dataGridView1.Rows[row].Cells[2].Value.ToString(); //MB address
                                string Value      = dataGridView1.Rows[row].Cells[3].Value.ToString(); //Value
                                string tagtype    = dataGridView1.Rows[row].Cells[6].Value.ToString(); //TagType

                                if (tagtype == "F")
                                {
                                    string ValueString = dataGridView1.Rows[row].Cells[3].Value.ToString();//Value

                                    //Convert float to Hex---------------------------------------------------------------------------------
                                    float strTofloat;
                                    bool  result = float.TryParse(ValueString, out strTofloat);

                                    if (result == true)
                                    {
                                        byte[] buffer = BitConverter.GetBytes(strTofloat);
                                        int    intVal = BitConverter.ToInt32(buffer, 0); //if don't have this line then program do like string to hex
                                                                                         //https://gregstoll.com/~gregstoll/floattohex/
                                                                                         //http://string-functions.com/string-hex.aspx
                                        string hexstring = intVal.ToString("X8");

                                        //separate hex string-------------------------------------------------------------------------------------
                                        string hexstrinng_left = hexstring.Substring(0, 4);
                                        ushort hexshort_left   = Convert.ToUInt16(hexstrinng_left, 16); //like under line

                                        string hexstrinng_right = hexstring.Substring(4);
                                        ushort hexshort_right   = Convert.ToUInt16(hexstrinng_right, 16);
                                        //Prepare MbAddress to send---------------------------------------------------------------------------------

                                        int    int32Mb_Address     = Convert.ToInt32(Mb_Address) - 400000 - 1;//-1 cause modscan32 start index 0
                                        ushort RightShortMbAddress = Convert.ToUInt16(int32Mb_Address);
                                        //ushort RightShortMbAddress = (ushort)int32Mb_Address;

                                        int    LeftMbAddress      = int32Mb_Address + 1;
                                        ushort LeftShortMbAddress = Convert.ToUInt16(LeftMbAddress);
                                        //ushort LeftShortMbAddress = (ushort)LeftMbAddress;
                                        //---------------------------------------------------------------------------------------------------------------
                                        master2Family.WriteSingleRegister(RightShortMbAddress, hexshort_right);
                                        master2Family.WriteSingleRegister(LeftShortMbAddress, hexshort_left);
                                    } //end if result
                                }     //end if Tagtype F
                                else if (tagtype == "B")
                                {
                                    bool boolvalue       = Convert.ToBoolean(Convert.ToInt16(Value));
                                    int  int32Mb_Address = Convert.ToInt32(Mb_Address) - 100000 - 1;//-1 cause modscan32 start index 0

                                    master2Family.WriteSingleCoil(Convert.ToUInt16(int32Mb_Address), boolvalue);

                                    mosbusAdrInputRegister[Count_Boolean][0] = int32Mb_Address;
                                    mosbusAdrInputRegister[Count_Boolean][1] = Convert.ToInt32(Value);
                                    ++Count_Boolean;
                                    //if (boolvalue == true)
                                    //{
                                    //    //slave.DataStore.InputDiscretes.Add(true);
                                    //    slave2Family.DataStore.InputDiscretes.Add(false);
                                    //}
                                    //else
                                    //{
                                    //    //slave.DataStore.InputDiscretes.Add(false);
                                    //    slave2Family.DataStore.InputDiscretes.Add(true);
                                    //}
                                } //end else if Tagtype B
                            }     //end for loop
                            int getlastaddress          = mosbusAdrInputRegister[mosbusAdrInputRegister.Length - 1][0];
                            int matchIndexInputregister = 0;
                            for (int indexInputRegister = 0; indexInputRegister <= getlastaddress; indexInputRegister++)
                            {
                                if (indexInputRegister == mosbusAdrInputRegister[matchIndexInputregister][0])
                                {
                                    if (mosbusAdrInputRegister[matchIndexInputregister][1] == 1)
                                    {
                                        //slave.DataStore.InputDiscretes.Add(true);
                                        slave2Family.DataStore.InputDiscretes.Add(true);
                                    }
                                    else
                                    {
                                        //slave.DataStore.InputDiscretes.Add(false);
                                        slave2Family.DataStore.InputDiscretes.Add(false);
                                    }
                                    matchIndexInputregister++;
                                }
                                else
                                {
                                    slave2Family.DataStore.InputDiscretes.Add(false);
                                }
                            }
                            datastore.InputRegisters.Clear();
                        }
                    } //end if ipv4
                }     //end foreach
            }
            catch (Exception ex)
            {
                using (StreamWriter sw = File.AppendText(indebuglogFolderPath + "\\" + filename + ".txt"))
                {
                    sw.WriteLine("ERROR : " + ex);
                }
            }
        }
Exemple #3
0
        private void FormAutomatic_Load(object sender, EventArgs e)
        {
            coilM22     = new bool[1];
            lastCoilM22 = new bool[1];

            coilM22[0]     = false;
            lastCoilM22[0] = false;


            // Create Modbus modbusMasterTCP
            ipAddress = "192.168.1.2"; // textBoxIPAddress.Text;
            //ipAddress = "127.0.0.1"; // textBoxIPAddress.Text;
            tcpClient.BeginConnect(ipAddress, tcpPort, null, null);
            modbusMasterTCP = ModbusIpMaster.CreateIp(tcpClient);

            timerReadModbus.Enabled = true; // aktifkan mode baca data dari plc


            // Serial Port Scanner
            serialPortScanner.PortName = "COM1"; //COM1

            try
            {
                serialPortScanner.Open();
                serialOpen = true;
            }
            catch (Exception err)
            {
                serialOpen = false;
                MessageBox.Show(err.ToString());
            }

            if (serialOpen)
            {
                thread = new Thread(bacaDataSerial);
                thread.Start();
                threadRun = true;
            }

            // Update Current Settings
            loadCurrentSetting();
            // Trigger M8 Kalau 4P
            int a = textBoxReference.Text.IndexOf('T', 4);

            if (a == 4)
            {
                modbusMasterTCP.WriteSingleCoil(1, 8, true);
            }
            else
            {
                modbusMasterTCP.WriteSingleCoil(1, 8, false);
            }
            totalPass = Int32.Parse(textBoxPass.Text);
            totalFail = Int32.Parse(textBoxFail.Text);
            totalQty  = Int32.Parse(textBoxTotalQty.Text);



            // Update ke PLC

            /*
             * try
             * {
             *  modbusMasterTCP.WriteSingleRegister(0, (ushort)totalPass); // MW0 == Pass
             *  modbusMasterTCP.WriteSingleRegister(1, (ushort)totalFail); // MW1 == Fail
             * }
             * catch (Exception err)
             * {
             *  // By Pass
             * }
             * */
            //
        }
Exemple #4
0
        private void bacaDataSerial()
        {
            while (serialOpen)
            {
                if (serialPortScanner.BytesToRead > 0)
                {
                    char data = (char)serialPortScanner.ReadChar();
                    if (data != '\r' || data != '\n')
                    {
                        dataSerial += data;
                    }

                    if (data == '\n')
                    {
                        Invoke(new Action(() => textBoxScannerData.Text = dataSerial));
                        // Check Length
                        if (dataSerial.Length == 32)
                        {
                            // Check Head Assy
                            for (int i = 6; i < 22; i++)
                            {
                                dataHeadAssy += dataSerial[i];
                            }


                            // Update TextBox Head Assy
                            Invoke(new Action(() => textBoxScannerHeadAssy.Text = dataHeadAssy));
                            //Invoke(new Action(() => textBoxTotalQty.Text = totalQty.ToString()));

                            // Compare Pass Fail
                            int retCompare = string.Compare(textBoxScannerHeadAssy.Text, textBoxHeadAssy.Text);
                            //retCompare = 0; // saya baypass dlu
                            // Pass Product
                            if (retCompare == 0)
                            {
                                totalPass++;
                                // Update Textbox
                                Invoke(new Action(() => textBoxPass.Text = totalPass.ToString()));
                                setTotalQty(getTotalQty() + 1); // update product count

                                // Update Textbox Data Matrix
                                DateTime date             = DateTime.Now;
                                string   stringDate       = date.ToString("ddMMyyhhmmss");
                                string   stringDataMatrix = textBoxReference.Text + stringDate + " " + getTotalQty().ToString("D" + 5);
                                Invoke(new Action(() => textBoxDataMatrix.Text = stringDataMatrix));

                                // Update Excell Data
                                updateExcelData();
                                // Send Pass Signal
                                try
                                {
                                    modbusMasterTCP.WriteSingleCoil(1, 11, true); // M11 => false
                                }
                                catch (Exception err)
                                {
                                    MessageBox.Show(err.ToString());
                                }
                            }
                            else
                            {
                                totalFail++;
                                Invoke(new Action(() => textBoxFail.Text       = totalFail.ToString()));
                                Invoke(new Action(() => textBoxDataMatrix.Text = ""));
                                try
                                {
                                    modbusMasterTCP.WriteSingleCoil(1, 11, false); // M11 => false
                                }
                                catch (Exception err)
                                {
                                    MessageBox.Show(err.ToString());
                                }
                            }

                            // Message to operator
                            // If Fail Show Textbox
                            if (retCompare != 0)
                            {
                                MessageBox.Show("Product Fail, Please Remove Product !!");                               //MessageBox.Show("dfas","Asda","
                            }
                            // If Pass Printing
                            else
                            {
                                //MessageBox.Show("masuk");

                                int a = textBoxReference.Text.IndexOf('T', 4);
                                if (a == 4)
                                {
                                    printLabel(3);
                                    //MessageBox.Show("4P");
                                }
                                else
                                {
                                    if (textBoxAA1.Text == "")
                                    {
                                        printLabel(2); // 3 pole no kc
                                        //MessageBox.Show("3pkc");
                                    }
                                    else
                                    {
                                        printLabel(1); // 3 pole
                                        //MessageBox.Show("3P");
                                    }
                                }
                            }


                            if (totalPass == totalQty)
                            {
                                MessageBox.Show("Production Completed !" + "Total Pass = "******"Total Qty = " + totalQty.ToString());
                            }

                            Invoke(new Action(() => timerClearScannerData.Enabled = true)); // aktifkan timer clear

                            dataSerial   = "";
                            dataHeadAssy = "";
                        }
                        else
                        {
                            try
                            {
                                modbusMasterTCP.WriteSingleCoil(1, 11, false); // M11 => false
                            }
                            catch (Exception err)
                            {
                                MessageBox.Show(err.ToString());
                            }
                            //MessageBox.Show("Scanner NO READ, Please Rescan !!");
                            //timerClearScannerData.Enabled = true;
                            Invoke(new Action(() => timerClearScannerData.Enabled = true));
                            dataSerial   = "";
                            dataHeadAssy = "";
                        }
                    }
                }
            }
        }
Exemple #5
0
        private bool ResponseData(IO_SERVER server, IO_COMMUNICATION comm, IO_DEVICE device, IO_PARA para, string value)
        {
            if (para == null)
            {
                return(false);
            }
            if (para.IO_POINTTYPE == "计算值" || para.IO_POINTTYPE == "关系数据库值")
            {
                return(false);
            }
            //设备地址不能为空
            if (device.IO_DEVICE_ADDRESS == "")
            {
                return(false);
            }
            try
            {
                //通过设备驱动进行数据解析,并生成下置的数据bytes
                if (device.DeviceDrive != null)
                {
                    ScadaDeviceKernel Driver = (ScadaDeviceKernel)device.DeviceDrive;

                    //获取参数中的
                    if (tcpClient != null && tcpClient.Connected && master != null)
                    {
                        ParaPack paraPack = new ParaPack(para.IO_PARASTRING);
                        if (paraPack.Count > 0)
                        {
                            ushort offset = ushort.Parse(paraPack.GetValue("偏置"));
                            switch (paraPack.GetValue("内存区"))
                            {
                            case "01":
                            {
                                if (ushort.Parse(value) > 0)
                                {
                                    master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, true);
                                }
                                else
                                {
                                    master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, false);
                                }
                            }
                            break;

                            case "02":    //此类型只能查询,不能写入
                            {
                            }
                            break;

                            case "03":
                            {
                                Modbus_Type datatype     = (Modbus_Type)Enum.Parse(typeof(Modbus_Type), paraPack.GetValue("数据类型"));
                                bool        ishigh       = paraPack.GetValue("存储位置") == "高八位" ? true : false;
                                int         charsize     = int.Parse(paraPack.GetValue("字节长度"));
                                bool        isposition   = paraPack.GetValue("按位存取") == "1" ? true : false;
                                int         dataposition = int.Parse(paraPack.GetValue("数据位"));
                                switch (datatype)
                                {
                                case Modbus_Type.单精度浮点数32位:
                                {
                                    ushort[] buff       = new ushort[2];
                                    float    WriteValue = float.Parse(value);
                                    ModbusConvert.SetReal(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.双精度浮点数64位:
                                {
                                    ushort[] buff       = new ushort[4];
                                    double   WriteValue = double.Parse(value);
                                    ModbusConvert.SetDouble(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.字符型:
                                {
                                    ushort[] buff       = new ushort[charsize];
                                    string   WriteValue = value;
                                    if (value.Length > charsize)
                                    {
                                        WriteValue = value.Substring(0, charsize);
                                    }
                                    if (value.Length < charsize)
                                    {
                                        WriteValue = value.PadRight(charsize, ' ');
                                    }
                                    ModbusConvert.SetString(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.无符号整数8位:
                                {
                                    ushort[] buff       = new ushort[1];
                                    byte     WriteValue = byte.Parse(value);
                                    ModbusConvert.SetByte(buff, 0, WriteValue, ishigh);
                                    master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                }
                                break;

                                case Modbus_Type.符号整数8位:
                                {
                                    ushort[] buff       = new ushort[1];
                                    sbyte    WriteValue = sbyte.Parse(value);
                                    ModbusConvert.SetSByte(buff, 0, WriteValue, ishigh);
                                    master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                }
                                break;

                                case Modbus_Type.无符号整数16位:
                                {
                                    if (isposition)
                                    {
                                        //获取当前寄存器的值
                                        ushort[] datas     = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1);
                                        ushort   dataValue = ModbusConvert.GetUShort(datas, 0);

                                        if (short.Parse(value) > 0)
                                        {
                                            dataValue = Convert.ToUInt16(dataValue >> dataposition & 1);
                                        }
                                        else
                                        {
                                            dataValue = Convert.ToUInt16(dataValue >> dataposition & 0);
                                        }
                                        //新发送的值

                                        ushort[] datas2 = new ushort[1];
                                        ModbusConvert.SetUShort(datas2, 0, dataValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]);
                                    }
                                    else
                                    {
                                        ushort   WriteValue = ushort.Parse(value);
                                        ushort[] buff       = new ushort[1];
                                        ModbusConvert.SetUShort(buff, 0, WriteValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                    }
                                }
                                break;

                                case Modbus_Type.符号整数16位:
                                {
                                    if (isposition)
                                    {
                                        //获取当前寄存器的值
                                        ushort[] datas     = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1);
                                        short    dataValue = ModbusConvert.GetShort(datas, 0);

                                        if (short.Parse(value) > 0)
                                        {
                                            dataValue = Convert.ToInt16(dataValue >> dataposition & 1);
                                        }
                                        else
                                        {
                                            dataValue = Convert.ToInt16(dataValue >> dataposition & 0);
                                        }
                                        //新发送的值

                                        ushort[] datas2 = new ushort[1];
                                        ModbusConvert.SetShort(datas2, 0, dataValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]);
                                    }
                                    else
                                    {
                                        Int16    WriteValue = Int16.Parse(value);
                                        ushort[] buff       = new ushort[1];
                                        ModbusConvert.SetShort(buff, 0, WriteValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                    }
                                }
                                break;

                                case Modbus_Type.无符号整数32位:
                                {
                                    uint     WriteValue = uint.Parse(value);
                                    ushort[] buff       = new ushort[2];
                                    ModbusConvert.SetUInt(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.符号整数32位:
                                {
                                    int      WriteValue = int.Parse(value);
                                    ushort[] buff       = new ushort[2];
                                    ModbusConvert.SetInt(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;
                                }
                            }
                            break;
                            }
                        }
                    }
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }