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; } } }
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 }
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); } }
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()); }
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); }