[Update] fix interval delay and update doc
This commit is contained in:
Родитель
ed96cbe977
Коммит
5b4e304359
11
README.md
11
README.md
|
@ -18,8 +18,8 @@ Refer to [Azure IoT Edge](https://github.com/Azure/azure-iot-edge)
|
||||||
|
|
||||||
## HowTo Run ##
|
## HowTo Run ##
|
||||||
This section will help you download the prebuilt module image from docker hub, and run it with IoT Edge directly.
|
This section will help you download the prebuilt module image from docker hub, and run it with IoT Edge directly.
|
||||||
1. Setup [Azure IoT Edge](https://github.com/Azure/azure-iot-edge) with compatible version on your machine.
|
1. Setup Azure IoT Edge [Windows](https://docs.microsoft.com/en-us/azure/iot-edge/quickstart) or [Linux](https://docs.microsoft.com/en-us/azure/iot-edge/quickstart-linux) with compatible version on your machine.
|
||||||
2. Follow [this](https://docs.microsoft.com/en-us/azure/iot-edge/quickstart) to deploy a custom IoT Edge module.
|
2. Follow [this](https://docs.microsoft.com/en-us/azure/iot-edge/tutorial-deploy-modbus-tcp) to deploy a custom IoT Edge module.
|
||||||
3. In the Image field, enter **microsoft/azureiotedge-modbus-tcp:1.0-preview**.
|
3. In the Image field, enter **microsoft/azureiotedge-modbus-tcp:1.0-preview**.
|
||||||
4. You may also want to provide configuration to the module when it starts, paste the configuration in the desired property field. For more about configuration, see [here](https://github.com/Azure/iot-edge-modbus#configuration).
|
4. You may also want to provide configuration to the module when it starts, paste the configuration in the desired property field. For more about configuration, see [here](https://github.com/Azure/iot-edge-modbus#configuration).
|
||||||
|
|
||||||
|
@ -27,11 +27,13 @@ This section will help you download the prebuilt module image from docker hub, a
|
||||||
If you prefer to build your own module, use the following script. Dockerfiles are located under [Docker](https://github.com/Azure/iot-edge-modbus/tree/master/Docker) folder, you should be able to find one for your platform. There are two Dockerfiles in each platform, the multi-stage "Dockerfile-auto" will automatically build source code and Docker image. The other "Dockerfile" requires you to build source code first and then copy binary to the image.
|
If you prefer to build your own module, use the following script. Dockerfiles are located under [Docker](https://github.com/Azure/iot-edge-modbus/tree/master/Docker) folder, you should be able to find one for your platform. There are two Dockerfiles in each platform, the multi-stage "Dockerfile-auto" will automatically build source code and Docker image. The other "Dockerfile" requires you to build source code first and then copy binary to the image.
|
||||||
**Note**: Arm32 multi-stage build doesn't work at this moment, please build it manually.
|
**Note**: Arm32 multi-stage build doesn't work at this moment, please build it manually.
|
||||||
**Note**: Please replace **PlatForm** in below scripts with the actual platform path you are trying to build.
|
**Note**: Please replace **PlatForm** in below scripts with the actual platform path you are trying to build.
|
||||||
|
|
||||||
### Multi-stage build ###
|
### Multi-stage build ###
|
||||||
```cmd
|
```cmd
|
||||||
>cd iot-edge-modbus/
|
>cd iot-edge-modbus/
|
||||||
>docker build -t modbusModule -f Docker/<PlatForm>/Dockerfile-auto .
|
>docker build -t modbusModule -f Docker/<PlatForm>/Dockerfile-auto .
|
||||||
```
|
```
|
||||||
|
|
||||||
### Manually build ###
|
### Manually build ###
|
||||||
The application requires the [.NET Core SDK 2.0](https://www.microsoft.com/net/download/windows).
|
The application requires the [.NET Core SDK 2.0](https://www.microsoft.com/net/download/windows).
|
||||||
```cmd
|
```cmd
|
||||||
|
@ -106,18 +108,21 @@ For more about Modbus, please refer to the [Wiki](https://en.wikipedia.org/wiki/
|
||||||
|
|
||||||
## Module Endpoints and Routing ##
|
## Module Endpoints and Routing ##
|
||||||
All telemetry are sent out from modbusOutput endpoint by default. Routing is enabled by specifying rules like below.
|
All telemetry are sent out from modbusOutput endpoint by default. Routing is enabled by specifying rules like below.
|
||||||
|
|
||||||
### Route to IoT Hub ###
|
### Route to IoT Hub ###
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"modbusToIoTHub":"FROM /messages/modules/modbus/outputs/modbusOutput INTO $upstream"
|
"modbusToIoTHub":"FROM /messages/modules/modbus/outputs/modbusOutput INTO $upstream"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Route to other (filter) modules ###
|
### Route to other (filter) modules ###
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"modbusToFilter":"FROM /messages/modules/modbus/outputs/modbusOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/input1\")"
|
"modbusToFilter":"FROM /messages/modules/modbus/outputs/modbusOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/input1\")"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Write to Modbus ###
|
### Write to Modbus ###
|
||||||
Modbus module also has an input enpoint to receive message/commands. Currently it supports writing back to a single register/cell in a Modbus slave. The content of command must be the following format.
|
Modbus module also has an input enpoint to receive message/commands. Currently it supports writing back to a single register/cell in a Modbus slave. The content of command must be the following format.
|
||||||
```json
|
```json
|
||||||
|
@ -136,5 +141,5 @@ The command should have a property "command-type" with value "ModbusWrite". Also
|
||||||
```
|
```
|
||||||
|
|
||||||
## Debug ##
|
## Debug ##
|
||||||
There is a flag **IOT_EDGE** at the first line in Program.cs, which can be turn off to debug the Modbus module in console mode. Running console mode requires IoT device connection string being inserted as a environment variable named **EdgeHubConnectionString**, and a local configuration file "iot-edge-modbus.json" since module twin is not available.
|
There is a flag **IOT_EDGE** at the first line in Program.cs, which can be turn off to debug the Modbus module in console mode. Running console mode requires IoT device connection string being inserted as a environment variable named **EdgeHubConnectionString**, and a local configuration file "iot-edge-modbus.json" since module twin is not available. You can copy "iot-edge-modbus.json" template from project root directory.
|
||||||
**Note**: running in console mode means none of the IoT Edge features is available. This mode is only to debug non edge-related functions.
|
**Note**: running in console mode means none of the IoT Edge features is available. This mode is only to debug non edge-related functions.
|
|
@ -55,6 +55,14 @@ namespace Modbus.Slaves
|
||||||
{
|
{
|
||||||
return ModbusSessionList.Find(x => x.config.HwId.ToUpper() == hwid.ToUpper());
|
return ModbusSessionList.Find(x => x.config.HwId.ToUpper() == hwid.ToUpper());
|
||||||
}
|
}
|
||||||
|
public void Release()
|
||||||
|
{
|
||||||
|
foreach (var session in ModbusSessionList)
|
||||||
|
{
|
||||||
|
session.ReleaseSession();
|
||||||
|
}
|
||||||
|
ModbusSessionList.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base class of Modbus session.
|
/// Base class of Modbus session.
|
||||||
|
@ -65,6 +73,7 @@ namespace Modbus.Slaves
|
||||||
public abstract Task<List<ModbusOutMessage>> ProcessOperations();
|
public abstract Task<List<ModbusOutMessage>> ProcessOperations();
|
||||||
public abstract Task WriteCB(string uid, string address, string value);
|
public abstract Task WriteCB(string uid, string address, string value);
|
||||||
public abstract Task InitSession();
|
public abstract Task InitSession();
|
||||||
|
public abstract void ReleaseSession();
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
----------------------- --------
|
----------------------- --------
|
||||||
|
@ -92,12 +101,7 @@ namespace Modbus.Slaves
|
||||||
config = conf;
|
config = conf;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region Destructors
|
|
||||||
~ModbusTCPSlaveSession()
|
|
||||||
{
|
|
||||||
m_socket.Dispose();
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
#region Private Properties
|
#region Private Properties
|
||||||
private const int m_reqSize = 12;
|
private const int m_reqSize = 12;
|
||||||
private const int m_bufSize = 512;
|
private const int m_bufSize = 512;
|
||||||
|
@ -165,6 +169,16 @@ namespace Modbus.Slaves
|
||||||
EncodeRead(x);
|
EncodeRead(x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void ReleaseSession()
|
||||||
|
{
|
||||||
|
if (m_socket != null)
|
||||||
|
{
|
||||||
|
m_socket.Disconnect(false);
|
||||||
|
m_socket.Dispose();
|
||||||
|
m_socket = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
private async Task ConnectSlave()
|
private async Task ConnectSlave()
|
||||||
|
|
|
@ -181,8 +181,8 @@ namespace Modbus.Containers
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// stop all activities while updating configuration
|
|
||||||
#if IOT_EDGE
|
#if IOT_EDGE
|
||||||
|
// stop all activities while updating configuration
|
||||||
await ioTHubModuleClient.SetInputMessageHandlerAsync(
|
await ioTHubModuleClient.SetInputMessageHandlerAsync(
|
||||||
"input1",
|
"input1",
|
||||||
DummyCallBack,
|
DummyCallBack,
|
||||||
|
@ -229,7 +229,7 @@ namespace Modbus.Containers
|
||||||
{
|
{
|
||||||
ModuleConfig config;
|
ModuleConfig config;
|
||||||
Slaves.ModuleHandle moduleHandle;
|
Slaves.ModuleHandle moduleHandle;
|
||||||
string jsonStr;
|
string jsonStr = null;
|
||||||
string serializedStr;
|
string serializedStr;
|
||||||
|
|
||||||
serializedStr = JsonConvert.SerializeObject(desiredProperties);
|
serializedStr = JsonConvert.SerializeObject(desiredProperties);
|
||||||
|
@ -243,8 +243,19 @@ namespace Modbus.Containers
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// get config from local file
|
Console.WriteLine("No configuration found in desired properties.");
|
||||||
jsonStr = File.ReadAllText(@"..\iot-edge-modbus.json");
|
if (File.Exists(@"iot-edge-modbus.json"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// get config from local file
|
||||||
|
jsonStr = File.ReadAllText(@"iot-edge-modbus.json");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Unable to read configuration from file. Error: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(jsonStr))
|
if (!string.IsNullOrEmpty(jsonStr))
|
||||||
|
@ -263,11 +274,11 @@ namespace Modbus.Containers
|
||||||
{
|
{
|
||||||
var userContext = new Tuple<DeviceClient, Slaves.ModuleHandle>(ioTHubModuleClient, moduleHandle);
|
var userContext = new Tuple<DeviceClient, Slaves.ModuleHandle>(ioTHubModuleClient, moduleHandle);
|
||||||
#if IOT_EDGE
|
#if IOT_EDGE
|
||||||
// Register callback to be called when a message is received by the module
|
// Register callback to be called when a message is received by the module
|
||||||
await ioTHubModuleClient.SetInputMessageHandlerAsync(
|
await ioTHubModuleClient.SetInputMessageHandlerAsync(
|
||||||
"input1",
|
"input1",
|
||||||
PipeMessage,
|
PipeMessage,
|
||||||
userContext);
|
userContext);
|
||||||
#else
|
#else
|
||||||
m_task_list.Add(Receive(userContext));
|
m_task_list.Add(Receive(userContext));
|
||||||
#endif
|
#endif
|
||||||
|
@ -301,11 +312,6 @@ namespace Modbus.Containers
|
||||||
var msgs = await s.ProcessOperations();
|
var msgs = await s.ProcessOperations();
|
||||||
result.AddRange(msgs);
|
result.AddRange(msgs);
|
||||||
}
|
}
|
||||||
if (!m_run)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
await Task.Delay(m_interval.Interval);
|
|
||||||
if (result.Count > 0)
|
if (result.Count > 0)
|
||||||
{
|
{
|
||||||
Message message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(result)));
|
Message message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(result)));
|
||||||
|
@ -316,7 +322,13 @@ namespace Modbus.Containers
|
||||||
await ioTHubModuleClient.SendEventAsync(message);
|
await ioTHubModuleClient.SendEventAsync(message);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (!m_run)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
await Task.Delay(m_interval.Interval);
|
||||||
}
|
}
|
||||||
|
moduleHandle.Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче