[Update] fix interval delay and update doc

This commit is contained in:
Stephen Chen 2017-11-16 14:32:35 +08:00
Родитель ed96cbe977
Коммит 5b4e304359
3 изменённых файлов: 54 добавлений и 23 удалений

Просмотреть файл

@ -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>