|
@@ -7,21 +7,17 @@ namespace CyberX8_Simulator.Devices
|
|
|
{
|
|
|
public class FestoSocketSimulator : SocketDeviceSimulator
|
|
|
{
|
|
|
- //Write Address
|
|
|
- private const ushort MODULE_0_OUTPUT_DATA_ADDRESS = 0x9C42;//FB36(16bit)
|
|
|
- private const ushort MODULE_1_OUTPUT_DATA_ADDRESS = 0x9C43;//MPA1气动模块(8bit,x 6 x 4 x 2 x 0)
|
|
|
- private const ushort MODULE_2_OUTPUT_DATA_ADDRESS = 0x9C44;//MPA1气动模块(8bit,7 ... 0)
|
|
|
- private const ushort MODULE_3_OUTPUT_DATA_ADDRESS = 0x9C45;//MPA1气动模块(8bit,3 ... 0)
|
|
|
+ //Write Address
|
|
|
+ private const ushort FESTO_DO_START_ADDRESS = 0x9C43;//FestoDO起始地址(40003)
|
|
|
|
|
|
//Read Address
|
|
|
- private const ushort MODULE_0_ECHO_OUTPUT_DATA_ADDRESS = 0xB151;//FB36(16bit)
|
|
|
- private const ushort MODULE_1_ECHO_OUTPUT_DATA_ADDRESS = 0xB153;//MPA1气动模块(8bit)
|
|
|
- private const ushort MODULE_2_ECHO_OUTPUT_DATA_ADDRESS = 0xB155;//MPA1气动模块(8bit)
|
|
|
- private const ushort MODULE_3_ECHO_OUTPUT_DATA_ADDRESS = 0xB157;//MPA1气动模块(8bit)
|
|
|
+ private const ushort FESTO_DI_START_ADDRESS = 0xB153;//FestoDI总起始地址(45395)
|
|
|
|
|
|
+ //Register Count
|
|
|
+ private const int FESTO_REGISTER_COUNT = 16;
|
|
|
private IByteTransform byteTransform = new BigEndianByteTransformBase();
|
|
|
/// <summary>
|
|
|
- /// 数据字典
|
|
|
+ /// 数据字典(DO_address - data)
|
|
|
/// </summary>
|
|
|
Dictionary<int, short> _festoOutputDataDic = new Dictionary<int, short>();
|
|
|
|
|
@@ -31,10 +27,10 @@ namespace CyberX8_Simulator.Devices
|
|
|
/// <param name="port"></param>
|
|
|
public FestoSocketSimulator(int port) : base(port)
|
|
|
{
|
|
|
- _festoOutputDataDic[0] = 0x00;//Module0
|
|
|
- _festoOutputDataDic[1] = 0x00;//Module1 (6 x 4 x 2 x 0)
|
|
|
- _festoOutputDataDic[2] = 0x00;//Mdoule2 (7 ... 0)
|
|
|
- _festoOutputDataDic[3] = 0x00;//Module3 (3 ... 0)
|
|
|
+ for(int i = 0; i < FESTO_REGISTER_COUNT; i++)
|
|
|
+ {
|
|
|
+ _festoOutputDataDic[i] = 0x00;
|
|
|
+ }
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 解析信息
|
|
@@ -50,54 +46,36 @@ namespace CyberX8_Simulator.Devices
|
|
|
ushort startAddress = byteTransform.TransUInt16(data, 8);//起始寄存器地址
|
|
|
short registerCount = byteTransform.TransInt16(data, 10);//寄存器数量
|
|
|
|
|
|
- byte[] bytes = new byte[2 * registerCount];//读取2 Byte数据
|
|
|
- switch (startAddress)
|
|
|
+ byte[] bytes = new byte[2 * registerCount];//读取2*registerCount Byte数据
|
|
|
+ if (startAddress >= FESTO_DI_START_ADDRESS)
|
|
|
{
|
|
|
- case MODULE_0_OUTPUT_DATA_ADDRESS:
|
|
|
- for(int i = 0; i < registerCount; i++)
|
|
|
- {
|
|
|
- Array.Copy(byteTransform.GetBytes(_festoOutputDataDic[0]), 0, bytes, i*2, 2);
|
|
|
- }
|
|
|
- break;
|
|
|
- case MODULE_1_OUTPUT_DATA_ADDRESS:
|
|
|
- for (int i = 0; i < registerCount; i++)
|
|
|
- {
|
|
|
- Array.Copy(byteTransform.GetBytes(_festoOutputDataDic[1]), 0, bytes, i*2, 2);
|
|
|
- }
|
|
|
- break;
|
|
|
- case MODULE_2_OUTPUT_DATA_ADDRESS:
|
|
|
- Array.Copy(byteTransform.GetBytes(_festoOutputDataDic[2]), 0, bytes, 0, 2);
|
|
|
- break;
|
|
|
- case MODULE_3_OUTPUT_DATA_ADDRESS:
|
|
|
- Array.Copy(byteTransform.GetBytes(_festoOutputDataDic[3]), 0, bytes, 0, 2);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ for (int i = 0; i < registerCount; i++)
|
|
|
+ {
|
|
|
+ Array.Copy(byteTransform.GetBytes(_festoOutputDataDic[i]), 0, bytes, i * 2, 2);
|
|
|
+ }
|
|
|
+ OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes));
|
|
|
}
|
|
|
- OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes));
|
|
|
+ else
|
|
|
+ {
|
|
|
+ OnWriteMessage(CreateError(flag, channel, command, 0x8A));
|
|
|
+ }
|
|
|
}
|
|
|
else if(command == 0x06)//写入
|
|
|
{
|
|
|
ushort startAddress = byteTransform.TransUInt16(data, 8);//起始寄存器地址
|
|
|
short value = byteTransform.TransInt16(data, 10);//写入的值(2 Byte)
|
|
|
- switch (startAddress)
|
|
|
+
|
|
|
+ if(startAddress >= FESTO_DO_START_ADDRESS)
|
|
|
{
|
|
|
- case MODULE_0_ECHO_OUTPUT_DATA_ADDRESS:
|
|
|
- _festoOutputDataDic[0] = value;
|
|
|
- break;
|
|
|
- case MODULE_1_ECHO_OUTPUT_DATA_ADDRESS:
|
|
|
- _festoOutputDataDic[1] = value;
|
|
|
- break;
|
|
|
- case MODULE_2_ECHO_OUTPUT_DATA_ADDRESS:
|
|
|
- _festoOutputDataDic[2] = value;
|
|
|
- break;
|
|
|
- case MODULE_3_ECHO_OUTPUT_DATA_ADDRESS:
|
|
|
- _festoOutputDataDic[3] = value;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ //modbus起始地址n为数据,n+1为诊断数据,取地址n下的数据
|
|
|
+ int index = (startAddress - FESTO_DO_START_ADDRESS) * 2;
|
|
|
+ _festoOutputDataDic[index] = value;
|
|
|
+ OnWriteMessage(CreateWriteResponse(flag, channel, command, startAddress, value));
|
|
|
}
|
|
|
- OnWriteMessage(CreateWriteResponse(flag, channel, command, startAddress, value));
|
|
|
+ else
|
|
|
+ {
|
|
|
+ OnWriteMessage(CreateError(flag, channel, command, 0x8A));
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -115,6 +93,7 @@ namespace CyberX8_Simulator.Devices
|
|
|
/// <returns></returns>
|
|
|
private byte[] CreateReadResponse(short flag, byte channel, byte command, short registerCount, byte[] values)
|
|
|
{
|
|
|
+
|
|
|
byte[] bytes = new byte[6 + 3 + values.Length];
|
|
|
Array.Copy(byteTransform.GetBytes(flag), 0, bytes, 0, 2);
|
|
|
bytes[2] = 0x00;
|
|
@@ -152,20 +131,7 @@ namespace CyberX8_Simulator.Devices
|
|
|
Array.Copy(valueByt, 0, bytes, 10, 2);
|
|
|
return bytes;
|
|
|
}
|
|
|
- /// <summary>
|
|
|
- /// 多重写回复
|
|
|
- /// </summary>
|
|
|
- /// <param name="flag"></param>
|
|
|
- /// <param name="channel"></param>
|
|
|
- /// <param name="command"></param>
|
|
|
- /// <param name="startAddress"></param>
|
|
|
- /// <param name="count"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private byte[] CreateMultiWriteResponse(short flag, byte channel, byte command, short startAddress, short count)
|
|
|
- {
|
|
|
- byte[] byt = new byte[1];
|
|
|
- return byt;
|
|
|
- }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 错误回复
|
|
|
/// </summary>
|