-
Notifications
You must be signed in to change notification settings - Fork 136
4.2 三种Api调用方法
luosheng edited this page Jun 7, 2023
·
6 revisions
首先,在使用Modbus.Net之前,你不仅需要加载Modbus.Net.dll主框架模块,还需要加载一个具体的协议模块,这个框架才能正常使用。
- 实例化一个Utility,比如:
IUtilityProperty utility = new ModbusUtility(ModbusType.Tcp, "192.168.1.10", 2, 0, Endian.LittleEndian);
- Modbus.Net中存在三种不同的端格式:
- 小端格式:Endian.LittleEndian,位序为倒序。
- 大端格式:Endian.BigEndianLsb,位序为倒序。
- 大端正序格式:Endian.BigEndianMsb,位序为正序。
- 调用Utility中的方法,IUtilityProperty中有一个方法,可以用来加载方法组。
public TUtilityMethod GetUtilityMethods<TUtilityMethod>() where TUtilityMethod : class, IUtilityMethod
调用时,可以使用如下方法调用
utility.GetUtilityMethods<IUtilityMethodDatas>()?.GetDatasAsync(...);
当Utility未实现相应的方法组时,GetUtilityMethods直接返回null。
有关BaseUtility
- BaseUtility中默认实现了IUtilityMethodData,目前包括GetDatasAsync和SetDatasAsync,它们分别表示读取值和设定值。
- Utility中的地址只有一个string,这个string描述了整个地址信息,这个地址应该怎么写由文档说明,因为不同的AddressTranslator可以决定它写法是不同的。
- 比如Modbus.Net.Modbus的30005的第11个位的写法为"3X 5.10",它的位从0开始所以位要减1。
- 实例化一个Machine,比如:
IMachineProperty machine = new ModbusMachine(ModbusType.Tcp, "192.168.1.10", new List<AddressUnit>(...), true, 2, 0, Endian.LittleEndian);
- 有关AddressUnit这里要特别说明一件事情:
- BaseMachine在组合时是以地址作为寻找一个AddressUnit的关键字的,因此无论如何要填写AddressUnit里的Area和Address,就算协议里没有地址也要填写一个Machine中唯一的假地址。
- 调用Machine中的方法,IMachineProperty中有一个方法,可以用来加载方法组。
public TMachineMethod GetMachineMethods<TUtilityMethod>() where TMachineMethod : class, IMachineMethod
调用时,可以使用如下方法调用
machine.GetMachineMethods<IMachineMethodDatas>()?.GetDatasAsync(...);
当Machine未实现相应的方法组时,GetMachineMethods直接返回null。
有关BaseMachine
- BaseMachine中默认实现了IMachineMethodData,目前包括GetDatasAsync和SetDatasAsync,,可以读写设备信息。
- BaseMachine有四种返回关键字,Id返回AddressUnit的Id,Name返回AddressUnit的Name,CommunicationTag返回AddressUnit的CommunicationTag,Address返回AddressUnit的地址(string格式)。
- CommunicationTag是为了屏蔽地址中的关键信息,并建议在json中作为键来使用的关键字,它可以大幅缩短json的长度。注意CommunicationTag如果要用的话,跟Id一样设备里也是唯一的。
MachineJobScheduler
- 实例化一个MachineJobScheduler,比如:
var machineJobScheduler = await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10);
- 添加任务链任务:比如,添加一个每10秒获取数据一次的任务:
var job = machineJobScheduler.From(machine.Id + ".From", machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result;
- 执行任务
await job.Run();
Modbus.Net Hangzhou Delian Science Technology Co.,Ltd. © 2023
-
2 Specification of Modbus.Net main framework
- 2.1 Modbus.Net Architecture
- 2.2 Transmission Control Layer Controller
- 2.3 Transmission Link Layer Connector
- 2.4 Concrete Protocol Layer ProtocolLinker
- 2.5 Abstract Protocol Layer Protocol
- 2.6 Protocol Presentation Layer Utility
- 2.7 Device Application Layer Machine
- 2.8 Task Application Layer MachineJob
-
3 Using Modbus.Net to implement a protocol
- 3.1 Global Tools
- 3.2 Extends Protocol and ProtocolUnit according to protocol specification
- 3.3 Extends Connector to create a link method
- 3.4 Extends Machine and Utility, creating two apis
- 3.5 Extends API methods to Machine and Utility
- 3.6 Extends Formater, Translator and Combiner, Creating Encoding,Decoding,Combining methods for address
- 3.7 Extends Controller, to control message