Example #1
0
 override public void setValue(int ivar, object value) // фунуция инициализации драйвера Модбас
 {
     for (int i = 0; i < registers.Count; i++)
     {
         if (ivar == registers[i].varcontext)
         {
             regModBus reg = registers[i];
             if (device.master)
             {
                 if (reg.regtype == 1 || reg.regtype == 2)
                 {
                     return;
                 }
             }
             lock (block)
             {
                 writeComm wr = new writeComm();
                 wr.reg     = reg.regtype;
                 wr.len     = reg.len;
                 wr.type    = reg.type;
                 wr.address = reg.address;
                 wr.unitId  = reg.unitId;
                 wr.value   = value;
                 killOld(wr, writeQuvery);
                 writeQuvery.Add(wr);
             }
             return;
         }
     }
 }
Example #2
0
        void writeVariable()
        {
            for (int i = 0; i < registers.Count; i++)
            {
                regModBus rg = registers[i];
                if (rg.regtype == 0)
                {
                    if (rg.len == 1)
                    {
                        bool b = varcoils[rg.address];
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                    else
                    {
                        bool[] b = new bool[rg.len];
                        for (int j = 0; j < rg.len; j++)
                        {
                            b[j] = varcoils[rg.address + j];
                        }
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                }// end type ==0
                if (rg.regtype == 1)
                {
                    if (rg.len == 1)
                    {
                        bool b = vardi[rg.address];
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                    else
                    {
                        bool[] b = new bool[rg.len];
                        for (int j = 0; j < rg.len; j++)
                        {
                            b[j] = vardi[rg.address + j];
                        }
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                }// end type ==1
                if (rg.regtype == 2)
                {
                    if (rg.type == 2 || rg.type == 3) //2 байтный int
                    {
                        if (rg.len == 1)
                        {
                            ushort b;
                            b = varir[rg.address];
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            ushort[] b = new ushort[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                b[j] = varir[rg.address + j];
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 4 && rg.type <= 7) //4 байтный int
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varir[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varir[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            int b = BitConverter.ToInt32(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            int[] b = new int[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varir[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varir[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToInt32(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 8 && rg.type <= 9) //4 байтный float
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varir[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varir[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            float b = BitConverter.ToSingle(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            float[] b = new float[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varir[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varir[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToSingle(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                }// end type ==2

                if (rg.regtype == 3)
                {
                    if (rg.type == 2 || rg.type == 3) //2 байтный int
                    {
                        if (rg.len == 1)
                        {
                            ushort b;
                            b = varhr[rg.address];
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            ushort[] b = new ushort[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                b[j] = varhr[rg.address + j];
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 4 && rg.type <= 7) //4 байтный int
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varhr[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varhr[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            int b = BitConverter.ToInt32(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            int[] b = new int[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varhr[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varhr[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToInt32(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 8 && rg.type <= 9) //4 байтный float
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varhr[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varhr[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            float b = BitConverter.ToSingle(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            float[] b = new float[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varhr[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varhr[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToSingle(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                } // end type ==3
            }     //for
        }
Example #3
0
        private static void LoadRegistersModBus(string namefile, int icondev, Device dev, Util.TypeDriver drvtype, string Pref) //  функция загрузки регистров Modbus
        {
            XmlDocument regxml = new XmlDocument();

            regxml.Load(namefile);
            DriverModBus driver = (DriverModBus)dev.driver;

            foreach (XmlNode n in regxml.SelectNodes("table/records/record")) // Считывание регистров из указанной подсекции конфигурационного файла
            {
                string name = "", description = "", address = "0", ssize = "1", type = "0", format = "2", unitId = "1";
                foreach (XmlNode m in n.ChildNodes)
                {
                    string attr = XmlExt.GetAttrValue(m, "name"), attr_txt = m.InnerText;

                    switch (attr) //  В зависимости от типа аттрибута, присваивается значение переменной
                    {
                    case "name":
                        name = Pref + attr_txt;
                        break;

                    case "description":
                        description = attr_txt;
                        break;

                    case "address":
                        address = attr_txt;
                        break;

                    case "size":
                        ssize = attr_txt;
                        break;

                    case "type":
                        type = attr_txt;
                        break;

                    case "format":
                        format = attr_txt;
                        break;

                    case "unitId":
                        unitId = attr_txt;
                        break;
                    }
                }
                ushort       size     = ushort.Parse(ssize);
                ushort       iaddress = ushort.Parse(address);
                int          typereg  = int.Parse(type);
                int          iformat  = int.Parse(format);
                Util.TypeVar vtype    = Util.TypeVar.Error;
                if (typereg == 0 || typereg == 1)
                {
                    vtype = Util.TypeVar.Boolean;
                }
                else
                {
                    if (iformat > 0 && iformat <= 7)
                    {
                        vtype = Util.TypeVar.Integer;
                    }
                    if (iformat > 7 && iformat < 11)
                    {
                        vtype = Util.TypeVar.Float;
                    }
                    if (iformat > 10 && iformat < 14)
                    {
                        vtype = Util.TypeVar.Long;
                    }
                    if (iformat > 13 && iformat < 16)
                    {
                        vtype = Util.TypeVar.Double;
                    }
                    if (iformat > 17 && iformat < 20)
                    {
                        vtype = Util.TypeVar.String;
                    }
                }
                /* создаем переменную*/
                Variable.appendVariable(name, description, vtype, size);
                int      ipv = Server.Count - 1;
                Context  con = Server.getContext(ipv);
                Variable var = (Variable)con.defContext;
                if ((typereg == 1 || typereg == 2) && dev.master)
                {
                    var.ReadOnly = true;
                }
                else
                {
                    var.ReadOnly = false;
                }
                var.Device = icondev;
                regModBus regs = new regModBus();
                regs.varcontext = ipv;
                regs.address    = iaddress;
                regs.len        = size;
                regs.regtype    = typereg;
                regs.type       = iformat;
                regs.unitId     = byte.Parse(unitId);
                driver.registers.Add(regs);
                dev.listVariables.Add(ipv);
                Server.setContext(ipv, con);
            }
        }
Example #4
0
        void writeVariable() // функция записи переменных конфигурации
        {
            // Подсчет времени потраченного на операцию
            //DateTime tm = DateTime.Now;  // переменная хранит начальное время запуска потока
            //Util.time = tm;

            // создание дубликата writeQuveryDuble и освобождение исходной коллеции
            // Исправлено Русинов. Зачем тут блокировать и создавать копию очереди?
            //            List<writeComm> writeQuveryDuble = new List<writeComm>();
            //            lock (block_DubBusTcpMaster)
            //            {
            //                for (int i = 0; i < writeQuvery.Count; i++)
            //                {
            //                    writeQuveryDuble.Add(writeQuvery[i]);
            //                }
            //                writeQuvery.Clear();

            for (int i = 0; i < registers.Count; i++)
            {
                regModBus rg = registers[i];
                if (rg.regtype == 0)
                {
                    if (rg.len == 1)
                    {
                        bool b = varcoils[rg.address];
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                    else
                    {
                        bool[] b = new bool[rg.len];
                        for (int j = 0; j < rg.len; j++)
                        {
                            b[j] = varcoils[rg.address + j];
                        }
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                }// end type ==0
                if (rg.regtype == 1)
                {
                    if (rg.len == 1)
                    {
                        bool b = vardi[rg.address];
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                    else
                    {
                        bool[] b = new bool[rg.len];
                        for (int j = 0; j < rg.len; j++)
                        {
                            b[j] = vardi[rg.address + j];
                        }
                        Variable.setVariable(rg.varcontext, b, true);
                    }
                }// end type ==1
                if (rg.regtype == 2)
                {
                    if (rg.type == 2 || rg.type == 3) //2 байтный int
                    {
                        if (rg.len == 1)
                        {
                            ushort b;
                            b = varir[rg.address];
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            ushort[] b = new ushort[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                b[j] = varir[rg.address + j];
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 4 && rg.type <= 7) //4 байтный int
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varir[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varir[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            int b = BitConverter.ToInt32(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            int[] b = new int[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varir[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varir[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToInt32(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 8 && rg.type <= 9) //4 байтный float
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varir[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varir[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            float b = BitConverter.ToSingle(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            float[] b = new float[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varir[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varir[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToSingle(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                }// end type ==2

                if (rg.regtype == 3)
                {
                    if (rg.type == 2 || rg.type == 3) //2 байтный int
                    {
                        if (rg.len == 1)
                        {
                            ushort b;
                            b = varhr[rg.address];
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            ushort[] b = new ushort[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                b[j] = varhr[rg.address + j];
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 4 && rg.type <= 7) //4 байтный int
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varhr[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varhr[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            int b = BitConverter.ToInt32(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            int[] b = new int[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varhr[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varhr[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToInt32(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                    if (rg.type >= 8 && rg.type <= 9) //4 байтный float
                    {
                        if (rg.len == 1)
                        {
                            byte[] b1 = BitConverter.GetBytes(varhr[rg.address]);
                            byte[] b2 = BitConverter.GetBytes(varhr[rg.address + 1]);
                            byte[] bb = new byte[4];
                            bb[0] = b2[0];
                            bb[1] = b2[1];
                            bb[2] = b1[0];
                            bb[3] = b1[1];
                            float b = BitConverter.ToSingle(bb, 0);
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                        else
                        {
                            float[] b = new float[rg.len];
                            for (int j = 0; j < rg.len; j++)
                            {
                                byte[] b1 = BitConverter.GetBytes(varhr[rg.address + (j * 2)]);
                                byte[] b2 = BitConverter.GetBytes(varhr[rg.address + (j * 2) + 1]);
                                byte[] bb = new byte[4];
                                bb[0] = b2[0];
                                bb[1] = b2[1];
                                bb[2] = b1[0];
                                bb[3] = b1[1];
                                b[j]  = BitConverter.ToSingle(bb, 0);
                            }
                            Variable.setVariable(rg.varcontext, b, true);
                        }
                    }
                } // end type ==3
            }     //for
             //            } // lock


            //DateTime tmnow = DateTime.Now;
            //int st = (int)((tmnow.Ticks - tm.Ticks) / 10000);
            //Util.errorMessage(" writeVariable time operation=", st.ToString());
        }
Example #5
0
        override public string Status() // переопределяемая функция, возвращающая статус драйвера Модбас
        {
            string s = "";

            if (device.type == Util.TypeDriver.ModBusTCPMaster)
            {
                s = "IP=" + param.ip + " Порт=" + param.port.ToString();
            }
            if (device.type == Util.TypeDriver.RezCanal)
            {
                s = "IP=" + param.ip + " Порт=" + param.port.ToString() + "\n" + "IP Два=" + param.ipdub + " Порт Два=" + param.portdub.ToString() + " Канал=" + Canal.ToString();
            }
            if (device.type == Util.TypeDriver.ModBusTCPSlave)
            {
                s = "Порт=" + param.port.ToString();
            }
            if (device.type == Util.TypeDriver.ModBusSerialMaster || device.type == Util.TypeDriver.ModBusSerialSlave)
            {
                s  = "PortName=" + param.portname + " Скорость=" + param.baudRate.ToString() + " encoding=" + param.encoding + "\nflowcontrolIn=";
                s += " databits=" + param.databits.ToString() + " stopbits=";
                s += (param.stopbits == StopBits.None) ? "None " : "";
                s += (param.stopbits == StopBits.One)?"One ":"";
                s += (param.stopbits == StopBits.OnePointFive) ? "One point five " : "";
                s += (param.stopbits == StopBits.Two) ? "Two " : "";
                s += (param.parity == Parity.None)?"None":"";          // None=0 Even=2 Odd=1 Mark=3 Space=4
                s += (param.parity == Parity.Even) ? "Even" : "";
                s += (param.parity == Parity.Odd) ? "Odd" : "";
                s += (param.parity == Parity.Mark) ? "Mark" : "";
                s += (param.parity == Parity.Space) ? "Space" : "";
            }
            s += "\nДлина очереди на запись " + writeQuvery.Count.ToString() + "\n";
            s += "\nИмя\t\tТип\t\tFormat\tАдресс\tРазмер\n";
            for (int ii = 0; ii < registers.Count; ii++)
            {
                regModBus regs = registers[ii];
                Context   con  = Server.getContext(regs.varcontext);
                s += con.Name + "\t" + regs.regtype.ToString() + "\t" + regs.type.ToString() + "\t" + regs.address.ToString() + "\t" + regs.len.ToString() + "\t\t";
                if (regs.len == 1)
                {
                    switch (regs.regtype)
                    {
                    case 0: s += varcoils[regs.address].ToString(); break;

                    case 1: s += vardi[regs.address].ToString(); break;

                    case 2: s += varir[regs.address].ToString(); break;

                    case 3: s += varhr[regs.address].ToString(); break;
                    }
                }
                else
                {
                    switch (regs.regtype)
                    {
                    case 0:
                        for (int i = 0; i < regs.len; i++)
                        {
                            s += varcoils[regs.address + i].ToString() + " ";
                        }
                        break;

                    case 1:
                        for (int i = 0; i < regs.len; i++)
                        {
                            s += vardi[regs.address].ToString() + " ";
                        }
                        break;

                    case 2:
                        for (int i = 0; i < regs.len; i++)
                        {
                            s += varir[regs.address].ToString() + " ";
                        }
                        break;

                    case 3:
                        for (int i = 0; i < regs.len; i++)
                        {
                            s += varhr[regs.address].ToString() + " ";
                        }
                        break;
                    }
                }
                s += "\n";
            }
            return(s);
        }