private void menuSubItem_Click(object sender, RoutedEventArgs e) { MenuItem selectedFunNum = sender as MenuItem; FunctionNumType functionNumType = (FunctionNumType)selectedFunNum.Tag; DisplayFunctionNumView(functionNumType); }
private void InitializeMenuTop() { MenuItem fuctionNumsMenuItem = new MenuItem(); fuctionNumsMenuItem.Header = "功能码"; string[] functionNumTypes = Enum.GetNames(typeof(FunctionNumType)); foreach (var item in functionNumTypes) { FunctionNumType functionNumType = (FunctionNumType)Enum.Parse(typeof(FunctionNumType), item); currentFunctionNumView = FunctionNumViewManager.GetFunctionNumView(functionNumType); if (null != currentFunctionNumView) { MenuItem menuSubItem = new MenuItem() { Header = item, Tag = functionNumType }; menuSubItem.Click += new RoutedEventHandler(menuSubItem_Click); fuctionNumsMenuItem.Items.Add(menuSubItem); } } this.menuTop.Items.Add(fuctionNumsMenuItem); }
public FunctionNum03View(FunctionNumType functionNum) { InitializeComponent(); this.functionNum = functionNum; InitializeTitle(); }
private void DisplayFunctionNumView(FunctionNumType functionNumType) { this.stLeftDown.Children.Clear(); currentFunctionNumView = FunctionNumViewManager.GetFunctionNumView(functionNumType); if (null != currentFunctionNumView) { this.stLeftDown.Children.Add((UserControl)currentFunctionNumView); } }
public static int GetCanOperatingRegisterMaxNumOneTime(FunctionNumType functionNumType) { int canOperatingRegistMaxNumOneTime = -1; if (canOperatingRegisteMaxNumOneTimeDic.ContainsKey(functionNumType)) { canOperatingRegistMaxNumOneTime = canOperatingRegisteMaxNumOneTimeDic[functionNumType]; } return(canOperatingRegistMaxNumOneTime); }
/// <summary> /// 将每个请求帧的客户端格式分成更小的请求帧: /// 原因:每次可以操作的寄存器个数有限。 /// </summary> /// <returns></returns> public static List <T> Splite <T>(FunctionNumType functionNum, int numOfOperatingRegister) where T : ICustomerRequestData, new() { List <T> customerRequestDatas = new List <T>(); //每次可以操作的最大寄存器个数 int canOperatingRegisterMaxNumOneTime = OperatingRegisteMaxNumOneTime.GetCanOperatingRegisterMaxNumOneTime(functionNum); if (canOperatingRegisterMaxNumOneTime == -1) //每次可以操作寄存器最大个数无限制,不用分包 { customerRequestDatas.Add(new T()); return(customerRequestDatas); } else { customerRequestDatas = Splite <T>(canOperatingRegisterMaxNumOneTime, numOfOperatingRegister); } return(customerRequestDatas); }
/// <summary> /// 生成modbus请求帧:用于写取寄存器值 /// </summary> /// <param name="dataPoints"> /// dataPointsataPints中的DataPoint必须同时满足如下条件(缺一不可); /// 1.设备地址相同; /// 2.写寄存器用的功能码相同; /// 3.写的值的数据类型相同(例如:数据类型都是int) /// 4.相邻DataPoint的寄存器地址是连续的。 /// </param> /// <returns>modbus请求帧</returns> public static List <List <byte> > CreateRequestCommandByteStreamForWriteRegisterBy(DataAnalyzeMode dataAnalyzeMode, List <DataPoint> dataPoints, FunctionNumType functionNumType) { List <List <byte> > requestCommandByteStreams = new List <List <byte> >(); if (null == dataPoints || dataPoints.Count < 1) { return(requestCommandByteStreams); } switch (functionNumType) { case FunctionNumType.FunctionNum05: requestCommandByteStreams = CreateRequestCommandByteStreamForFunNum05(dataPoints); break; case FunctionNumType.FunctionNum06: requestCommandByteStreams = CreateRequestCommandByteStreamForFunNum06(dataAnalyzeMode, dataPoints); break; case FunctionNumType.FunctionNum15: requestCommandByteStreams = CreateRequestCommandByteStreamForFunNum15(dataPoints); break; case FunctionNumType.FunctionNum16: requestCommandByteStreams = CreateRequestCommandByteStreamForFunNum16(dataAnalyzeMode, dataPoints); break; default: break; } return(requestCommandByteStreams); }
public static IFunctionNumView GetFunctionNumView(FunctionNumType functionNumType) { IFunctionNumView funNumView = null; switch (functionNumType) { case FunctionNumType.FunctionNum01: break; case FunctionNumType.FunctionNum02: break; case FunctionNumType.FunctionNum03: funNumView = new FunctionNum03View(); break; case FunctionNumType.FunctionNum04: break; case FunctionNumType.FunctionNum05: break; case FunctionNumType.FunctionNum06: funNumView = new FunctionNum06View(); break; case FunctionNumType.FunctionNum07: break; case FunctionNumType.FunctionNum08: break; case FunctionNumType.FunctionNum09: break; case FunctionNumType.FunctionNum10: break; case FunctionNumType.FunctionNum11: break; case FunctionNumType.FunctionNum12: break; case FunctionNumType.FunctionNum13: break; case FunctionNumType.FunctionNum14: break; case FunctionNumType.FunctionNum15: break; case FunctionNumType.FunctionNum16: break; case FunctionNumType.FunctionNum17: break; case FunctionNumType.FunctionNum18: break; case FunctionNumType.FunctionNum19: break; case FunctionNumType.FunctionNum20: break; default: break; } return(funNumView); }
/// <summary> /// 解析返回的数据 /// </summary> /// <param name="dataAnalyzeMode"> 解析数据方式 </param> /// <param name="requestByteData"> /// 请求数据字节流, /// 注意:要求第一个字节位是:单元标识符(从机地址位), /// 即:如果是TCP请求帧,要求去掉TCP报头所剩下的字节。 /// 例如03功能码,要求请求数据字节流第一个字节位<see cref="FunNum03RequestDataBase.DeviceAddress"/> /// </param> /// <param name="receviceByteData"> /// 响应数据字节流 /// 注意:要求第一个字节位是:单元标识符(从机地址位), /// 即:如果是TCP响应帧,要求去掉TCP报头所剩下的字节。 /// 例如03功能码,要求响应数据字节流第一个字节位<see cref="FunNum03RequestDataBase.DeviceAddress"/> /// </param> /// <returns></returns> public static AnalyzeRecivedDataReponse AnalyzeRecivedData(DataAnalyzeMode dataAnalyzeMode, List <byte> requestByteData, List <byte> receviceByteData) { AnalyzeRecivedDataReponse reponse = new AnalyzeRecivedDataReponse(); reponse = RecivedDataCorrespondToRequesData(requestByteData, receviceByteData); if (!(reponse.ModbusReponseSuccess && reponse.AnalyzeRecivedDataSuccess)) { reponse.ModbusReponseSuccess = false; return(reponse); } byte funNumHex = receviceByteData[1]; //功能码的16进制值 string funNmDecimal = Convert.ToString(funNumHex, 10); //功能码的10进制值字符串 FunctionNumType functionNumType = 0; Enum.TryParse(funNmDecimal, true, out functionNumType); switch (functionNumType) { case FunctionNumType.FunctionNum01: reponse = AnalyzeRecivedDataByFunNum01(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum02: break; case FunctionNumType.FunctionNum03: reponse = AnalyzeRecivedDataByFunNum03(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum04: break; case FunctionNumType.FunctionNum05: reponse = AnalyzeRecivedDataByFunNum05(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum06: reponse = AnalyzeRecivedDataByFunNum06(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum07: break; case FunctionNumType.FunctionNum08: break; case FunctionNumType.FunctionNum09: break; case FunctionNumType.FunctionNum10: break; case FunctionNumType.FunctionNum11: break; case FunctionNumType.FunctionNum12: break; case FunctionNumType.FunctionNum13: break; case FunctionNumType.FunctionNum14: break; case FunctionNumType.FunctionNum15: reponse = AnalyzeRecivedDataByFunNum015(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum16: reponse = AnalyzeRecivedDataByFunNum16(dataAnalyzeMode, requestByteData, receviceByteData); break; case FunctionNumType.FunctionNum17: break; case FunctionNumType.FunctionNum18: break; case FunctionNumType.FunctionNum19: break; case FunctionNumType.FunctionNum20: break; default: throw new ArgumentOutOfRangeException(); } return(reponse); }