/// <summary> /// PLC와 통신할 PLC ADDRESS를 추가한다. /// </summary> /// <param name="Address">추가할 주소</param> /// <returns></returns> public virtual bool AddAddress(string Address, enPLCValueType type = enPLCValueType.INT) { try { DataRow row = dtAddress.NewRow(); row["Address"] = Address; row["ValueType"] = type; //if (this.GetType() == Type.GetType("PLCComm.TEST_PLC") && ConnctionStatus == enStatus.OK) //{ // row["Value"] = 0; // row["Value(Int)"] = 0; // row["Value(Hex)"] = "0000"; // row["Value(String)"] = string.Empty; //} //else row["Value"] = DBNull.Value; row["Value(Int)"] = DBNull.Value; row["Value(Hex)"] = DBNull.Value; row["Value(String)"] = DBNull.Value; dtAddress.Rows.Add(row); return(true); } catch (Exception ex) { throw ex; } }
/// <summary> /// 검색할 Address 추가 /// </summary> /// <param name="Address">Address 값</param> /// /// <param name="type">ValueType</param> /// <returns></returns> public bool AddAddress(string Address, enPLCValueType type = enPLCValueType.INT) { try { return(plc.AddAddress(Address, type)); } catch (Exception ex) { ProcException(ex); //return false; throw ex; } }
/// <summary> /// 등록된 어드레스의 값을 요청한 타입으로 가지고 온다. /// </summary> /// <param name="Address">요청 주소</param> /// <param name="valuetype">요청 값 타임</param> /// <returns></returns> public AddressValue GetValue(string Address, enPLCValueType valuetype) { try { if (ConnctionStatus != enStatus.OK) { throw new Exception("PLC와 연결이 끊어 졌습니다."); } DataRow[] row = this.dtAddress.Select("Address = '" + Address + "'"); if (row.Length > 0) { AddressValue rtn = new AddressValue(); switch (valuetype) { case enPLCValueType.HEX: rtn.Value = row[0]["Value(HEX)"]; break; case enPLCValueType.STRING: rtn.Value = row[0]["Value(STRING)"]; break; default: rtn.Value = row[0]["Value(INT)"]; break; } rtn.ValueType = valuetype; return(rtn); } else { throw new Exception("확인(등록) 되어 있지 PLC Address입니다.[" + Address + "]"); } } catch (Exception ex) { throw ex; } }
public AddressValue(object value, enPLCValueType valuetype) { Value = value; ValueType = valuetype; }
/// <summary> /// 각 어드레스에 값이 변경 되었을 경우.. Log를 기록하고, 등록되 주소 값 변경 이벤트가 있으면 비동기 실행 하여준다. /// </summary> /// <param name="address"></param> /// <param name="ReceiveValue">변경된 값 byte배열로 넘기거나 3자 이상 문자열만 HEX로 보내고 나머지는 숫자(int)로 넘길것</param> /// <param name="isWirteByte"></param> /// <param name="SendByte"></param> /// <param name="ReceiveByte"></param> /// <returns></returns> protected void ChangeddAddressValue(string address, object ReceiveValue, bool isWirteByte, byte[] SendByte, byte[] ReceiveByte) { try { lock (this) { DataRow dr = AddressGetRow(address); if (dr == null) { LogWrite("ChangeddAddressValue", $"미등록된 주소 값변경 수신(미처리)[Address]{address} [ReceiveValue]{ReceiveValue}"); return; } object oldValue = dr["Value"] != DBNull.Value ? dr["Value"] : "(null)"; object newValue = null; enPLCValueType vType = (enPLCValueType)dr["ValueType"]; enPLCValueType nType = enPLCValueType.INT; short intReceiveValue = -1; bool isChage = false; string tmp; short[] bts = ReceiveValue as short[]; //신규값 처리 및 값 변경 여부 확인한다. if (bts != null) { //바이트 배열 처리 //2개 이하면 short 이므로 if (bts.Length < 2) { //int16 처리 intReceiveValue = bts[0]; isChage = Fnc.obj2int(dr["Value(INT)"]) != intReceiveValue; newValue = intReceiveValue; } else { //Hex처리 nType = enPLCValueType.HEX; newValue = fnc.ShortToHex(bts); isChage = !Fnc.obj2String(dr["Value(HEX)"]).Equals(newValue.ToString()); } } else if (short.TryParse(ReceiveValue.ToString(), out intReceiveValue)) { //int16 처리 if (nType != vType) { isChage = true; } else { isChage = (short)dr["Value(INT)"] != intReceiveValue; } newValue = intReceiveValue; } else { //hex 처리 isChage = !Fnc.obj2String(dr["Value(HEX)"]).Equals(ReceiveValue.ToString()); nType = enPLCValueType.HEX; } //변경이 되었으면 로그를 남기로 이벤트를 실행 한다. if (isChage) { if (isWirteByte) { if (SendByte != null) { LogWrite("ChangeddAddressValue", "[Sent] " + fnc.ByteToHex(SendByte)); } if (ReceiveByte != null) { LogWrite("ChangeddAddressValue", "[Received] " + fnc.ByteToHex(ReceiveByte)); } } LogWrite("ChangeddAddressValue", string.Format("[{0}] {1} --> {2}", dr["Address"], oldValue, intReceiveValue.ToString("X4"))); if (nType == enPLCValueType.INT) { dr["Value"] = intReceiveValue; dr["Value(INT)"] = intReceiveValue; tmp = string.Format("{0:X4}", intReceiveValue); dr["Value(HEX)"] = tmp; dr["Value(STRING)"] = fnc.HexToString(tmp); } else { //hex dr["Value"] = newValue; dr["Value(INT)"] = DBNull.Value; dr["Value(HEX)"] = newValue; dr["Value(STRING)"] = fnc.HexToString(newValue.ToString()); } //이벤트 등록 여부 확인 if (dicEvtAdd_ch.ContainsKey(address)) { List <delChAddressValue> lst = dicEvtAdd_ch[address]; foreach (delChAddressValue del in lst) { del.BeginInvoke(address, vType, oldValue, newValue, null, null); } } } } } catch { throw; } }
public override bool AddAddress(string Address, enPLCValueType type = enPLCValueType.INT) { Item_Add(Address); return(base.AddAddress(Address, type)); }