예제 #1
0
        /// <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;
            }
        }
예제 #2
0
 /// <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;
     }
 }
예제 #3
0
        /// <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;
            }
        }
예제 #4
0
 public AddressValue(object value, enPLCValueType valuetype)
 {
     Value     = value;
     ValueType = valuetype;
 }
예제 #5
0
        /// <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;
            }
        }
예제 #6
0
        public override bool AddAddress(string Address, enPLCValueType type = enPLCValueType.INT)
        {
            Item_Add(Address);

            return(base.AddAddress(Address, type));
        }