使用外掛式開發稱重儀表驅動,RS232串列埠對接各類地磅秤資料實現ERP管理

2023-01-05 15:01:27

在ERP系統中,採集一線的生產資料是重要工作之一,而稱重計量是企業的核心資產資料,人工計重費時費力,還容易出錯,重量資料是否正確,直接影響企業的採購或銷售額。基於此,由系統對接電子秤實現自動抓取資料是企業管理的第一步。

電子秤,一般由重量感測器、砝碼、底座、儀表等組成。儀表與感測器相連,儀表一般具有記錄皮重、歸零等基本功能,大部分的儀表廠家都包含了串列埠資料對接的介面,滿足企業的資料採集需求。

採集資料一般使用DB9 RS232串列埠線,連線電腦的串列埠,但是現代電腦基本沒有保留串列埠頭,可以購買RS232串列埠轉USB轉接線。

重點來了,上位機如何採集儀表的重量資料?

根據不同廠家的型號不同資料協定也有所不同,以耀華XK3190-A9這款為例,廠家協定的說明:

協定規定了,起止位、資料位、符號、小數點位置、校驗位等引數說明,根據這個協定進行解析就可以形成上位機的重量資料。

核心程式碼:

        /// <summary>
        /// 耀華A9稱重資料
        /// </summary>
        /// <param name="byteFrame">幀資料</param>
        private string ConvertWeight(byte[] byteFrame)
        {
            string value = string.Empty;
            if (byteFrame == null || byteFrame.Length == 0)
            {
                return value;
            }
            //對接收到的資料進行校驗
            byte byteVerif = (byte)(byteFrame[1] ^ byteFrame[2] ^ byteFrame[3] ^ byteFrame[4] ^ byteFrame[5] ^ byteFrame[6] ^ byteFrame[7] ^ byteFrame[8]);
            //校驗高位
            byte verifHigh = (byte)((byteVerif & 0xf0) >> 4);
            //校驗低位
            byte verifLow = (byte)(byteVerif & 0x0f);

            if (verifHigh > 9)
                verifHigh = (byte)(verifHigh + 0x37);
            else
                verifHigh = (byte)(verifHigh + 0x30);

            if (verifLow > 9)
                verifLow = (byte)(verifLow + 0x37);
            else
                verifLow = (byte)(verifLow + 0x30);

            if (byteFrame[9] == verifHigh && byteFrame[10] == verifLow)
            {
                List<byte> listDigit = new List<byte>() { (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38, (byte)0x39 };

                StringBuilder sbDigit = new StringBuilder();
                //獲取稱重資料
                for (int i = 2; i < 8; i++)
                {
                    if (!listDigit.Contains(byteFrame[i]))
                        byteFrame[i] = (byte)0x30;

                    sbDigit.Append(byteFrame[i] - 0x30);
                }
                //小數點位置
                int dotPos = byteFrame[8] - 0x30;
                int exponent = -dotPos;
                double weightValue = Convert.ToInt32(sbDigit.ToString()) * Math.Pow(10, exponent);
                //負數處理
                if (byteFrame[1] == 0x2D)
                    weightValue = -weightValue;
                value = FormatWeight(weightValue);
            }
            return value;
        }

同一廠家不同型號的儀表,定義的協定都不一樣,這點比較費事。所以在開發這類需求的時候,可以考慮統一封裝一個稱重基礎類,定義初始化、開啟串列埠、關閉串列埠、獲取重量等通用介面,不同型號使用子類實現業務邏輯。這樣外層的呼叫,不需要關心每個儀表型號。如果考慮插播服務,可以使用外掛式開發,原理就是使用反射掃描讀取外部dll,只要實現了基礎類別就可以熱載入稱重驅動。

        /// <summary>
        /// 查詢外部電子秤驅動
        /// 路徑:{root}/
        /// </summary>
        /// <param name="type">型別</param>
        /// <returns></returns>
        public static WeightBase FindExt(string type)
        {
            WeightBase WeighBase = null;

            string dirName = AppDomain.CurrentDomain.BaseDirectory + "plugins\\weight";
            // 掃描外部電子秤驅動
            if (System.IO.Directory.Exists(dirName))
            {

                var files = System.IO.Directory.GetFiles(dirName);
                foreach (var file in files)
                {
                    var ext = file.Substring(file.LastIndexOf('.') + 1);
                    if (ext == "dll" || ext == "exe")
                    {
                        var ass = Assembly.LoadFrom(file);
                        if (ass != null)
                        {
                            WeighBase = Find(ass, type);
                            if (WeighBase != null)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            return WeighBase;
        }
        public static bool IsScale(Type t)
        {
            var tWeighBase = typeof(WeightBase);
            if (t.BaseType == null)
                return false;
            return t.BaseType == tWeighBase || t.BaseType.BaseType == tWeighBase;// 子及孫
        }

 

  本人開發的這款PC稱重軟體就是使用了這種方案,可以在不升級主程式的情況下,隨時支援一款儀表驅動。