/// <summary> /// 获取请求帧(字节流) /// </summary> /// <typeparam name="T">客户端请求信息</typeparam> /// <param name="customerRequestData">客户端请求信息</param> /// <returns>请求帧(字节流)</returns> /// <remarks> /// 调用示例: /// FunNum01CustomerRequestData funCustomer01 = new FunNum01CustomerRequestData(); /// bool success = CreateRequestByteStreams(funCustomer01); /// </remarks> public static List <List <byte> > CreateRequestByteStreamsStatic <T>(ICustomerRequestData <T> customerRequestData) where T : IFunNumRequestDataBase { var rtuRequesCmdByteStreams = new List <List <byte> >(); try { rtuRequesCmdByteStreams = TCPRequesCommandCreator.CreateRequestCommandByteStream(customerRequestData); } catch (Exception) { rtuRequesCmdByteStreams = null; } return(rtuRequesCmdByteStreams); }
/// <summary> /// 根据功能码,执行相应的操作 /// (暂时是ModbusTCP、UDP公用接口) /// /// 特别注意: /// T类型只是针对如下功能码: /// 06\16 /// 其他功能码可以设置为任何类型,因为没用到类型T, /// 只是为了统一接口,而使用了泛型函数。 /// /// </summary> /// <typeparam name="T">设置的值的类型,只能是如下类型: /// double\ float\ int \long \short\ uint\ ulong\ ushort /// </typeparam> /// <param name="customerRequestData">客户端的请求</param> /// <returns></returns> public bool OperateFunctionNum <T>(ICustomerRequestData customerRequestData) { bool succeed = true; try { List <List <byte> > rtuRequesCmdByteStreams = RTURequesCommandCreator.CreateRequestCommandByteStream <T>(customerRequestData); foreach (var item in rtuRequesCmdByteStreams) { WriteSerialPort(item.ToArray()); } } catch (Exception) { succeed = false; } return(succeed); }
/**************************************************************************** * 这些列算法的核心: * 第一步:将ICustomerRequestData分解成若干个IFunNumRequestDataBase; * 第二步:将第一步得到的若干个IFunNumRequestDataBase转换成对应数量的 * FunNumRequestDataTCP(TCP请求帧) * 第三步:将若干个IFunNumRequestDataTCP 转换成对应数量的请求帧字节流 ****************************************************************************/ /// <summary> /// 从ICustomerRequestData 获取 若干个请求字节流 /// </summary> /// <typeparam name="T"> /// IFunNumRequestDataBase的实现类 /// </typeparam> /// <param name="customerRequestData">客户端请求信息</param> /// <returns>请求字节流List</returns> private static List <List <byte> > CreateRequestCommandByteStreamsFromCustomerRequestData <T>(ICustomerRequestData <T> customerRequestData) where T : IFunNumRequestDataBase { List <List <byte> > requesCommandByteStreams = new List <List <byte> >(); //第一步:将ICustomerRequestData分解成若干个IFunNumRequestDataBase; List <T> funNumRequestDataBases = customerRequestData.CovertToFunNumRequestDataBases(); foreach (var questDataBase in funNumRequestDataBases) { //第二步:将第一步得到的若干个IFunNumRequestDataBase转换成对应数量的FunNumRequestDataTCP(TCP 请求帧) FunNumRequestDataTCP funNumRequestDataRtu = new FunNumRequestDataTCP(questDataBase); //第三步:将若干个IFunNumRequestDataTCP 转换成对应数量的请求帧字节流 requesCommandByteStreams.Add(funNumRequestDataRtu.ToByteList()); } return(requesCommandByteStreams); }
/// <summary> /// 将ICustomerRequestData(界面输入的请求信息)转换成TCP请求帧<see cref="FunNumRequestDataTCP"/>(若干个) /// 说明: /// 一个ICustomerRequestData对应若干个TCP请求帧<see cref="FunNumRequestDataTCP"/>, /// 然后返回请求对应的请求字节流List<List<byte>> /// </summary> /// <typeparam name="T"> /// T类型只能是如下类型:IFunNumRequestDataBase 接口的实现类 /// </typeparam> /// <param name="customerRequestData">客户端请求信息</param> /// <returns></returns> public static List <List <byte> > CreateRequestCommandByteStream <T>(ICustomerRequestData <T> customerRequestData) where T : IFunNumRequestDataBase { return(CreateRequestCommandByteStreamsFromCustomerRequestData(customerRequestData));; }
/// <summary> /// 获取请求帧(字节流) /// </summary> /// <typeparam name="T">客户端请求信息</typeparam> /// <param name="customerRequestData">客户端请求信息</param> /// <returns>请求帧(字节流)</returns> /// <remarks> /// 调用示例: /// FunNum01CustomerRequestData funCustomer01 = new FunNum01CustomerRequestData(); /// bool success = CreateRequestByteStreams(funCustomer01); /// </remarks> public List <List <byte> > CreateRequestByteStreams <T>(ICustomerRequestData <T> customerRequestData) where T : IFunNumRequestDataBase { return(CreateRequestByteStreamsStatic(customerRequestData)); }
/// <summary> /// 将ICustomerRequestData(界面输入的请求信息)转换成RTU请求帧(若干个) /// 说明: /// 一个ICustomerRequestData对应若干个RTU请求帧,故返回List<List<byte>> /// </summary> /// <typeparam name="T"> /// 1.T类型只能是如下类型: /// double\ float\ int \long \short\ uint\ ulong\ ushort /// 2.T类型只是针对如下功能码: /// 06\16 /// 其他功能码可以设置为任何类型,因为没用到类型T, /// 只是为了统一接口,而使用了泛型函数。 /// </typeparam> /// <param name="customerRequestData">若干个RTU请求帧</param> /// <returns></returns> public static List <List <byte> > CreateRequestCommandByteStream <T>(ICustomerRequestData customerRequestData) { List <List <byte> > requesCommandByteStreams = new List <List <byte> >(); switch (customerRequestData.FunctionNum) { case FunctionNumType.FunctionNum01: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum01(customerRequestData); break; case FunctionNumType.FunctionNum02: break; case FunctionNumType.FunctionNum03: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum03(customerRequestData); break; case FunctionNumType.FunctionNum04: break; case FunctionNumType.FunctionNum05: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum05(customerRequestData); break; case FunctionNumType.FunctionNum06: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum06 <T>(customerRequestData); 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: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum15(customerRequestData); break; case FunctionNumType.FunctionNum16: requesCommandByteStreams = CreateRequestCommandByteStreamsForFunNum16 <T>(customerRequestData); break; case FunctionNumType.FunctionNum17: break; case FunctionNumType.FunctionNum18: break; case FunctionNumType.FunctionNum19: break; case FunctionNumType.FunctionNum20: break; default: break; } return(requesCommandByteStreams); }
private static List <List <byte> > CreateRequestCommandByteStreamsForFunNum16 <T>(ICustomerRequestData customerRequestData) { List <List <byte> > requesCommandByteStreams = new List <List <byte> >(); FunNum16CustomerRequestData <T> funNum16CustomerRequestData = (FunNum16CustomerRequestData <T>)customerRequestData; List <FunNum16RequestDataBase> funNum16RequestDataBases = funNum16CustomerRequestData.CovertToFunNum16RequestDataBases(); foreach (FunNum16RequestDataBase item in funNum16RequestDataBases) { FunNum16RequestDataRTU funNum16RequestDataRTU = new FunNum16RequestDataRTU(); funNum16RequestDataRTU.FunNum16RequestDataBase = item; requesCommandByteStreams.Add(funNum16RequestDataRTU.ToByteList()); } return(requesCommandByteStreams); }
/**************************************************************************** * 这些列算法的核心: * 第一步:将ICustomerRequestData分解成若干个IFunNumRequestDataBase; * 第二步:将第一步得到的若干个IFunNumRequestDataBase转换成对应数量的 * IFunNumRequestDataRTU(RTU请求帧) * 第三步:将若干个IFunNumRequestDataRTU转换成对应数量的请求帧字节流 ****************************************************************************/ private static List <List <byte> > CreateRequestCommandByteStreamsForFunNum01(ICustomerRequestData customerRequestData) { List <List <byte> > requesCommandByteStreams = new List <List <byte> >(); FunNum01CustomerRequestData funNum01CustomerRequestData = (FunNum01CustomerRequestData)customerRequestData; //第一步:将ICustomerRequestData分解成若干个IFunNumRequestDataBase; List <FunNum01RequestDataBase> funNum01RequestDataBases = funNum01CustomerRequestData.CovertToFunNum01RequestDataBases(); foreach (FunNum01RequestDataBase item in funNum01RequestDataBases) { FunNum01RequestDataRTU funNum01RequestDataRTU = new FunNum01RequestDataRTU(); //第二步:将第一步得到的若干个IFunNumRequestDataBase转换成对应数量的IFunNumRequestDataRTU(RTU请求帧) funNum01RequestDataRTU.FunNum01RequestDataBase = item; //第三步:将若干个IFunNumRequestDataRTU转换成对应数量的请求帧字节流 requesCommandByteStreams.Add(funNum01RequestDataRTU.ToByteList()); } return(requesCommandByteStreams); }