Browse Source

Modify Festo simulator;

niuyx 2 months ago
parent
commit
40ee29cde6

+ 38 - 0
CyberX8_RT/Config/Devices/FestoControllerCfg-Simulator.xml

@@ -38,4 +38,42 @@
 	<DO Name="Festo0.DO34" Address="40008" Invert="false" Bit="4"/>
 	<DO Name="Festo0.DO35" Address="40009" Invert="false" Bit="6"/>
   </FestoDeviceConfig>
+  <FestoDeviceConfig Name="Festo1" IpAddress="127.0.0.1" Port="503" SendTimeout="2000" RecvTimeout="2000" DIStartAddress="45395" Channel="1"> 
+    <DO Name="Festo1.DO0"  Address="40003" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO1"  Address="40003" Invert="false" Bit="1"/>
+	<DO Name="Festo1.DO2"  Address="40003" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO3"  Address="40003" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO4"  Address="40003" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO5"  Address="40003" Invert="false" Bit="5"/>
+	<DO Name="Festo1.DO6"  Address="40003" Invert="false" Bit="6"/>
+	<DO Name="Festo1.DO7"  Address="40003" Invert="false" Bit="7"/>
+	<DO Name="Festo1.DO8"  Address="40004" Invert="false" Bit="0"/>
+	<DO Name="Festo1.DO9"  Address="40004" Invert="false" Bit="1"/>
+	<DO Name="Festo1.DO10" Address="40004" Invert="false" Bit="2"/>
+	<DO Name="Festo1.DO11" Address="40004" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO12" Address="40004" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO13" Address="40004" Invert="false" Bit="5"/>
+	<DO Name="Festo1.DO14" Address="40004" Invert="false" Bit="6"/>
+	<DO Name="Festo1.DO15" Address="40004" Invert="false" Bit="7"/>
+	<DO Name="Festo1.DO16" Address="40005" Invert="false" Bit="0"/>
+	<DO Name="Festo1.DO17" Address="40005" Invert="false" Bit="1"/>
+	<DO Name="Festo1.DO18" Address="40005" Invert="false" Bit="2"/>
+	<DO Name="Festo1.DO19" Address="40005" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO20" Address="40005" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO21" Address="40005" Invert="false" Bit="5"/>
+	<DO Name="Festo1.DO22" Address="40005" Invert="false" Bit="6"/>
+	<DO Name="Festo1.DO23" Address="40005" Invert="false" Bit="7"/>	
+	<DO Name="Festo1.DO24" Address="40006" Invert="false" Bit="0"/>
+	<DO Name="Festo1.DO25" Address="40006" Invert="false" Bit="2"/>
+	<DO Name="Festo1.DO26" Address="40006" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO27" Address="40006" Invert="false" Bit="6"/>	
+	<DO Name="Festo1.DO28" Address="40003" Invert="false" Bit="3"/>
+	<DO Name="Festo1.DO29" Address="40007" Invert="false" Bit="2"/>
+	<DO Name="Festo1.DO30" Address="40007" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO31" Address="40007" Invert="false" Bit="6"/>	
+	<DO Name="Festo1.DO32" Address="40008" Invert="false" Bit="0"/>
+	<DO Name="Festo1.DO33" Address="40008" Invert="false" Bit="2"/>
+	<DO Name="Festo1.DO34" Address="40008" Invert="false" Bit="4"/>
+	<DO Name="Festo1.DO35" Address="40009" Invert="false" Bit="6"/>
+  </FestoDeviceConfig>
 </FestoControllerConfig>

+ 1 - 0
CyberX8_Simulator/Config/UILayout.xml

@@ -44,5 +44,6 @@
 
 	<Navigation Id="Festo" Name="Festo">
 		<SubView Id="Festo0" Name="Festo0" ViewClass="CyberX8_Simulator.Views.FestoView" Assembly="CyberX8_Simulator" Port="502"/>
+		<SubView Id="Festo1" Name="Festo1" ViewClass="CyberX8_Simulator.Views.FestoView" Assembly="CyberX8_Simulator" Port="503"/>
 	</Navigation>
 </MECFUI>

+ 33 - 67
CyberX8_Simulator/Devices/FestoSocketSimulator.cs

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