mirror of
https://github.com/OpenLogics/MewtocolNet.git
synced 2025-12-06 03:01:24 +00:00
Fix typecodes
This commit is contained in:
16
AutoTools.DocBuilder/AutoTools.DocBuilder.csproj
Normal file
16
AutoTools.DocBuilder/AutoTools.DocBuilder.csproj
Normal file
@@ -0,0 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<IsPublishable>false</IsPublishable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\MewtocolNet\MewtocolNet.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
645
AutoTools.DocBuilder/Docs/plctypes.md
Normal file
645
AutoTools.DocBuilder/Docs/plctypes.md
Normal file
@@ -0,0 +1,645 @@
|
||||
# PLC Type Table
|
||||
Auto Generated @ **2023-07-21 15:07:27Z**
|
||||
|
||||
All supported PLC types for auto recognition are listed in this table. Other ones might also be supported but are shown as unknown in the library. Some models are never uniquely identifiable by their typecode and need extra hints like Prog Capacity in EXRT or RT.
|
||||
|
||||
Typecode explained:
|
||||
```
|
||||
From left to right
|
||||
0x
|
||||
07 <= extended code (00 non mewtocol 7 devices)
|
||||
20 <= Is hex for 32 (Prog capacity)
|
||||
A5 <= Is the actual typecode, can overlap with others
|
||||
```
|
||||
> <b>Discontinued PLCs</b><br>
|
||||
> These are PLCs that are no longer sold by Panasonic. Marked with ⚠️
|
||||
|
||||
> <b>EXRT PLCs</b><br>
|
||||
> These are PLCs that utilize the basic `%EE#RT` and `%EE#EX00RT` command. All newer models do this. Old models only use the `%EE#RT` command.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>Capacity</th>
|
||||
<th>Code</th>
|
||||
<th>Enum</th>
|
||||
<th>DCNT</th>
|
||||
<th>EXRT</th>
|
||||
<th>Tested</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>ECOLOGIX</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> ELC500 </td>
|
||||
<td> 0k </td>
|
||||
<td><code>0x070010</code></td>
|
||||
<td><i>ECOLOGIX_0k__ELC500</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP0</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C10, C14, C16 </td>
|
||||
<td> 2.7k </td>
|
||||
<td><code>0x000040</code></td>
|
||||
<td><i>FP0_2c7k__C10_C14_C16</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C32, SL1 </td>
|
||||
<td> 5k </td>
|
||||
<td><code>0x000041</code></td>
|
||||
<td><i>FP0_5k__C32_SL1</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> T32 </td>
|
||||
<td> 10k </td>
|
||||
<td><code>0x000A42</code></td>
|
||||
<td><i>FP0_10c0k__T32</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP0H</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C32ET/EP </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020B1</code></td>
|
||||
<td colspan="2"><i>FP0H_32k__C32ETsEP</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C32T/P </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020B0</code></td>
|
||||
<td colspan="2"><i>FP0H_32k__C32TsP</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP0R</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C10, C14, C16 </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x000046</code></td>
|
||||
<td colspan="2"><i>FP0R_16k__C10_C14_C16</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C32 </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002047</code></td>
|
||||
<td colspan="2"><i>FP0R_32k__C32</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> F32 </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002049</code></td>
|
||||
<td colspan="2"><i>FP0R_32k__F32</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> T32 </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002048</code></td>
|
||||
<td colspan="2"><i>FP0R_32k__T32</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP1</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C14, C16 </td>
|
||||
<td> 0.9k </td>
|
||||
<td><code>0x000004</code></td>
|
||||
<td><i>FP1_0c9k__C14_C16</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C24, C40 </td>
|
||||
<td> 2.7k </td>
|
||||
<td><code>0x000005</code></td>
|
||||
<td><i>FP1_2c7k__C24_C40</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C56, C72 </td>
|
||||
<td> 5k </td>
|
||||
<td><code>0x000006</code></td>
|
||||
<td><i>FP1_5k__C56_C72</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP10</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 30k </td>
|
||||
<td><code>0x001E20</code></td>
|
||||
<td><i>FP10_30k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 60k </td>
|
||||
<td><code>0x003C20</code></td>
|
||||
<td><i>FP10_60k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP10S</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 30k </td>
|
||||
<td><code>0x001E20</code></td>
|
||||
<td><i>FP10S_30k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP10SH</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 30k </td>
|
||||
<td><code>0x001E30</code></td>
|
||||
<td><i>FP10SH_30k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 60k </td>
|
||||
<td><code>0x003C30</code></td>
|
||||
<td><i>FP10SH_60k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x007830</code></td>
|
||||
<td><i>FP10SH_120k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP2</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001050</code></td>
|
||||
<td><i>FP2_16k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002050</code></td>
|
||||
<td><i>FP2_32k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP2SH</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002062</code></td>
|
||||
<td><i>FP2SH_32k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 60k </td>
|
||||
<td><code>0x003C60</code></td>
|
||||
<td><i>FP2SH_60k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x0078E0</code></td>
|
||||
<td><i>FP2SH_120k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP3</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 10k </td>
|
||||
<td><code>0x000A03</code></td>
|
||||
<td><i>FP3_10k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001013</code></td>
|
||||
<td><i>FP3_16k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP5</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001002</code></td>
|
||||
<td><i>FP5_16k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 24k </td>
|
||||
<td><code>0x001812</code></td>
|
||||
<td><i>FP5_24k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP7</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS21 </td>
|
||||
<td> 64k </td>
|
||||
<td><code>0x074009</code></td>
|
||||
<td colspan="2"><i>FP7_64k__CPS21</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS31 </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x077805</code></td>
|
||||
<td colspan="2"><i>FP7_120k__CPS31</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS31E </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x077804</code></td>
|
||||
<td colspan="2"><i>FP7_120k__CPS31E</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS31ES </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x077807</code></td>
|
||||
<td colspan="2"><i>FP7_120k__CPS31ES</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS31S </td>
|
||||
<td> 120k </td>
|
||||
<td><code>0x077808</code></td>
|
||||
<td colspan="2"><i>FP7_120k__CPS31S</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS41E </td>
|
||||
<td> 196k </td>
|
||||
<td><code>0x07C403</code></td>
|
||||
<td colspan="2"><i>FP7_196k__CPS41E</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> CPS41ES </td>
|
||||
<td> 196k </td>
|
||||
<td><code>0x07C406</code></td>
|
||||
<td colspan="2"><i>FP7_196k__CPS41ES</i></td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-C</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001013</code></td>
|
||||
<td><i>FPdC_16k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-e</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 2.7k </td>
|
||||
<td><code>0x000045</code></td>
|
||||
<td><i>FPde_2c7k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-M</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C16T </td>
|
||||
<td> 0.9k </td>
|
||||
<td><code>0x000004</code></td>
|
||||
<td><i>FPdM_0c9k__C16T</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C20R, C20T, C32T </td>
|
||||
<td> 2.7k </td>
|
||||
<td><code>0x000005</code></td>
|
||||
<td><i>FPdM_2c7k__C20R_C20T_C32T</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C20RC, C20TC, C32TC </td>
|
||||
<td> 5k </td>
|
||||
<td><code>0x000006</code></td>
|
||||
<td><i>FPdM_5k__C20RC_C20TC_C32TC</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ❌ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-SIGMA</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 12k </td>
|
||||
<td><code>0x000C43</code></td>
|
||||
<td><i>FPdSIGMA_12k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x0010E1</code></td>
|
||||
<td><i>FPdSIGMA_16k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002044</code></td>
|
||||
<td><i>FPdSIGMA_32k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> - </td>
|
||||
<td> 40k </td>
|
||||
<td><code>0x0028E1</code></td>
|
||||
<td><i>FPdSIGMA_40k</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-X</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C40RT0A </td>
|
||||
<td> 2.5k </td>
|
||||
<td><code>0x00007A</code></td>
|
||||
<td><i>FPdX_2c5k__C40RT0A</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C14R </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001070</code></td>
|
||||
<td><i>FPdX_16k__C14R</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ✅ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C14T/P </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001076</code></td>
|
||||
<td><i>FPdX_16k__C14TsP</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> L14 </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x001073</code></td>
|
||||
<td><i>FPdX_16k__L14</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C30R, C60R </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002071</code></td>
|
||||
<td><i>FPdX_32k__C30R_C60R</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C30T/P, C60T/P, C38AT, C40T </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002077</code></td>
|
||||
<td><i>FPdX_32k__C30TsP_C60TsP_C38AT_C40T</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ✅ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> L30, L60 </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x002074</code></td>
|
||||
<td><i>FPdX_32k__L30_L60</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-X0</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> L14, L30 </td>
|
||||
<td> 2.5k </td>
|
||||
<td><code>0x000072</code></td>
|
||||
<td><i>FPdX0_2c5k__L14_L30</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> L40, L60 </td>
|
||||
<td> 8k </td>
|
||||
<td><code>0x000875</code></td>
|
||||
<td><i>FPdX0_8k__L40_L60</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> L40, L60 </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x00107F</code></td>
|
||||
<td><i>FPdX0_16k__L40_L60</i></td>
|
||||
<td align=center>⚠️</td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" height=50>📟 <b>FP-XH</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C14R </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x0010A0</code></td>
|
||||
<td colspan="2"><i>FPdXH_16k__C14R</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ✅ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C14T/P </td>
|
||||
<td> 16k </td>
|
||||
<td><code>0x0010A4</code></td>
|
||||
<td colspan="2"><i>FPdXH_16k__C14TsP</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C30R, C40R, C60R </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020A1</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__C30R_C40R_C60R</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C30T/P, C40T, C60T/P </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020A5</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__C30TsP_C40T_C60TsP</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ✅ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C38AT </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020A7</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__C38AT</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C40ET, C60ET </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020AE</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__C40ET_C60ET</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> C60ETF </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020AF</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__C60ETF</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> M4T/L </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020A8</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__M4TsL</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> M8N16T/P </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020AC</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__M8N16TsP</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> M8N30T </td>
|
||||
<td> 32k </td>
|
||||
<td><code>0x0020AD</code></td>
|
||||
<td colspan="2"><i>FPdXH_32k__M8N30T</i></td>
|
||||
<td align=center> ✅ </td>
|
||||
<td align=center> ❌ </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
186
AutoTools.DocBuilder/Docs/reverse_engineering_data.md
Normal file
186
AutoTools.DocBuilder/Docs/reverse_engineering_data.md
Normal file
@@ -0,0 +1,186 @@
|
||||
# Open Questions
|
||||
|
||||
- What is the HW information byte for?
|
||||
- What are the last bytes of the EXRT message for?
|
||||
|
||||
# Mewtocol Init
|
||||
|
||||
| PLC TYPE | CPU Code | Machine Code | HW Information|
|
||||
|--------------|--------------|--------------|---------------|
|
||||
| FPX C14 R | 20 | 70 | 02 |
|
||||
| FPX C30 T | 20 | 77 | 02 |
|
||||
| FPX-H C14 R | 20 | A0 | 01 |
|
||||
| FPX-H C30 T | 20 | A5 | 01 |
|
||||
|
||||
## FPX 16k C14R Actual Response Examples
|
||||
|
||||
### %EE$RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 20 | Model code |
|
||||
| 25 | Version |
|
||||
| 16 | Prog capacity |
|
||||
| 80 | Op mode |
|
||||
| 00 | Link unit |
|
||||
| E1 | Error flag |
|
||||
| 2D00 | Self diag error |
|
||||
|
||||
### %EE$EX00RT Normal Operation
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 00 | Extended mode
|
||||
| 32 | Data item count
|
||||
| 70 | Machine type
|
||||
| 00 | Version (Fixed to 00)
|
||||
| 16 | Prog capacity in K
|
||||
| 80 | Operation mode / status
|
||||
| 00 | Link unit
|
||||
| E1 | Error flag
|
||||
| 2D00 | Self diag error
|
||||
| 50 | Version
|
||||
| 02 | Hardware information
|
||||
| 0 | Number of programs
|
||||
| 4100 | Program size BCD
|
||||
| 1600 | Header size (no. of words) bcd
|
||||
| 1604 | System register size
|
||||
| 96230000001480004 | ?
|
||||
|
||||
What are the last bytes?
|
||||
|
||||
FP-X 16k C14R
|
||||
96 23 00 00 00 14 80 00 4
|
||||
|
||||
FP-X 32k C30T/P
|
||||
96 23 00 00 00 14 80 00 4
|
||||
|
||||
FP-XH 32k C30T/P
|
||||
96 23 00 00 00 40 00 00 4
|
||||
|
||||
FP-XH 16k C14R
|
||||
96 23 00 00 00 40 00 00 4
|
||||
|
||||
## FP-XH 16k C14R Actual Response Examples
|
||||
|
||||
### %EE$RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 20 | Model code |
|
||||
| 16 | Version |
|
||||
| 16 | Prog capacity |
|
||||
| 81 | Op mode |
|
||||
| 00 | Link unit |
|
||||
| 60 | Error flag |
|
||||
| 0000 | Self diag error |
|
||||
|
||||
## FP-X0 2.5k L14,L30
|
||||
|
||||
### %EE$RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 72 | Model code |
|
||||
| 12 | Version |
|
||||
| 02 | Prog capacity |
|
||||
| 82 | Op mode |
|
||||
| 00 | Link unit |
|
||||
| 00 | Error flag |
|
||||
| 0000 | Self diag error |
|
||||
|
||||
### %EE$EX00RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 00 | Extended mode
|
||||
| 32 | Data item count
|
||||
| 72 | Machine type
|
||||
| 00 | Version (Fixed to 00)
|
||||
| 02 | Prog capacity in K
|
||||
| 82 | Operation mode / status
|
||||
| 00 | Link unit
|
||||
| 00 | Error flag
|
||||
| 0000 | Self diag error
|
||||
| 23 | Version
|
||||
| 01 | Hardware information
|
||||
| 0 | Number of programs
|
||||
| 4100 | Program size BCD
|
||||
| 0301 | Header size (no. of words) bcd
|
||||
| 2819 | System register size
|
||||
| 0000001480004 | ?
|
||||
|
||||
## FP0 2.7k C10,C14
|
||||
|
||||
### %EE$RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 05 | Model code |
|
||||
| 12 | Version |
|
||||
| 03 | Prog capacity |
|
||||
| 82 | Op mode |
|
||||
| 00 | Link unit |
|
||||
| 00 | Error flag |
|
||||
| 0000 | Self diag error |
|
||||
|
||||
### %EE$EX00RT
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|------------|-----------|
|
||||
| 00 | Extended mode
|
||||
| 32 | Data item count
|
||||
| 40 | Machine type
|
||||
| 00 | Version (Fixed to 00)
|
||||
| 03 | Prog capacity in K
|
||||
| 82 | Operation mode / status
|
||||
| 00 | Link unit
|
||||
| 00 | Error flag
|
||||
| 0000 | Self diag error
|
||||
| 23 | Version
|
||||
| 01 | Hardware information
|
||||
| 0 | Number of programs
|
||||
| 4100 | Program size BCD
|
||||
| 0301 | Header size (no. of words) bcd
|
||||
| 2819 | System register size
|
||||
| 20130000080070004 | ?
|
||||
|
||||
# Mewtocol-7 Com
|
||||
|
||||
## Getting the status of the plc
|
||||
|
||||
`%EE#RT`
|
||||
|
||||
Normal plc would return the default, see above.
|
||||
|
||||
The FP7 series returns:
|
||||
|
||||
`%EE$RT0000000100000000`
|
||||
|
||||
> This indicates that the device uses the Mewtocol 7 format
|
||||
|
||||
When trying to use EXRT the FP7 returns not supported
|
||||
|
||||
[R] `%EE#EX00RT00`
|
||||
|
||||
[S] `%EE!42`
|
||||
|
||||
Then request the status from the PLC using Mewtocol 7
|
||||
|
||||
[R] `>@EEE00#30STRD00`
|
||||
|
||||
[O] `>@EEE00$30STRD`
|
||||
|
||||
|Reponse Byte|Description|
|
||||
|-------------|-----------|
|
||||
| 00 | Read status (always 0) |
|
||||
| 07 | series code: 7 = FP7 |
|
||||
| 10 | model code: 3 = CPS41E, 4 = CPS31E, 5 = CPS31, 6 = CPS41ES, 7 = CPS31ES, 8 = CPS31S, 9 = CPS21, 10 = ElC500 |
|
||||
| 0000 | user special order code (Not important) |
|
||||
| 0453 | latest cpu version = 4.53 |
|
||||
| 0453 | communication cpu version = 4.53 |
|
||||
| 0453 | operation cpu version = 4.53 |
|
||||
| 01 | op mode = 4.53 |
|
||||
| 00 | error flag |
|
||||
| 0000 | self diag error |
|
||||
| 00 | sd card information |
|
||||
150
AutoTools.DocBuilder/Program.cs
Normal file
150
AutoTools.DocBuilder/Program.cs
Normal file
@@ -0,0 +1,150 @@
|
||||
//This program builds Markdown and docs for all kinds of data
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Reflection.PortableExecutable;
|
||||
using System.Text;
|
||||
using MewtocolNet;
|
||||
|
||||
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
|
||||
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
||||
|
||||
Console.WriteLine("Building docs for PLC types...");
|
||||
|
||||
var entryLoc = Assembly.GetEntryAssembly();
|
||||
ArgumentNullException.ThrowIfNull(entryLoc);
|
||||
|
||||
string filePath = null!;
|
||||
|
||||
if (args.Length == 0) {
|
||||
|
||||
filePath = Path.Combine(entryLoc.Location, @"..\..\..\..\Docs\plctypes.md");
|
||||
|
||||
} else {
|
||||
|
||||
filePath = args[0];
|
||||
|
||||
}
|
||||
|
||||
Console.WriteLine($"{filePath}");
|
||||
|
||||
StringBuilder markdownBuilder = new StringBuilder();
|
||||
|
||||
var plcNames = Enum.GetNames<PlcType>().OrderBy(x => x).ToArray();
|
||||
|
||||
void WritePlcTypeTable(string[] names) {
|
||||
|
||||
var groups = names.Select(x => x.ToNameDecompose())
|
||||
.GroupBy(x => x.Group)
|
||||
.SelectMany(g => g.OrderBy(x => x.Size))
|
||||
.GroupBy(x => x.Group);
|
||||
|
||||
markdownBuilder.AppendLine("<table>");
|
||||
|
||||
bool isFirstIt = true;
|
||||
|
||||
foreach (var group in groups) {
|
||||
|
||||
group.OrderBy(x => x.TypeCode);
|
||||
|
||||
bool isFirstGroup = true;
|
||||
|
||||
foreach (var enu in group) {
|
||||
|
||||
string cpuOrMachCode = null!;
|
||||
|
||||
cpuOrMachCode = enu.TypeCode.ToString("X6");
|
||||
ArgumentNullException.ThrowIfNull(enu);
|
||||
|
||||
//first iteration
|
||||
if (isFirstIt) {
|
||||
|
||||
markdownBuilder.AppendLine("<tr>");
|
||||
|
||||
markdownBuilder.AppendLine($"<th>Type</th>");
|
||||
markdownBuilder.AppendLine($"<th>Capacity</th>");
|
||||
markdownBuilder.AppendLine($"<th>Code</th>");
|
||||
markdownBuilder.AppendLine($"<th>Enum</th>");
|
||||
markdownBuilder.AppendLine($"<th>DCNT</th>");
|
||||
markdownBuilder.AppendLine($"<th>EXRT</th>");
|
||||
markdownBuilder.AppendLine($"<th>Tested</th>");
|
||||
|
||||
markdownBuilder.AppendLine("</tr>");
|
||||
|
||||
isFirstIt = false;
|
||||
|
||||
}
|
||||
|
||||
if (isFirstGroup) {
|
||||
|
||||
markdownBuilder.AppendLine("<tr>");
|
||||
|
||||
markdownBuilder.AppendLine($"<td colspan=\"7\" height=50>📟 <b>{group.Key}</b> </td>");
|
||||
|
||||
markdownBuilder.AppendLine("</tr>");
|
||||
|
||||
isFirstGroup = false;
|
||||
|
||||
}
|
||||
|
||||
markdownBuilder.AppendLine("<tr>");
|
||||
|
||||
markdownBuilder.AppendLine($"<td> {(enu.SubTypes.Length == 0 ? "-" : string.Join(", ", enu.SubTypes))} </td>");
|
||||
markdownBuilder.AppendLine($"<td> {enu.Size}k </td>");
|
||||
markdownBuilder.AppendLine($"<td><code>0x{cpuOrMachCode}</code></td>");
|
||||
|
||||
if (enu.IsDiscontinuedModel) {
|
||||
|
||||
markdownBuilder.AppendLine($"<td><i>{enu.EncodedName}</i></td>");
|
||||
markdownBuilder.AppendLine($"<td align=center>⚠️</td>");
|
||||
|
||||
} else {
|
||||
|
||||
markdownBuilder.AppendLine($"<td colspan=\"2\"><i>{enu.EncodedName}</i></td>");
|
||||
|
||||
}
|
||||
|
||||
markdownBuilder.AppendLine($"<td align=center> {(enu.UsesEXRT ? "✅" : "❌")} </td>");
|
||||
markdownBuilder.AppendLine($"<td align=center> {(enu.WasTestedLive ? "✅" : "❌")} </td>");
|
||||
|
||||
markdownBuilder.AppendLine("</tr>");
|
||||
|
||||
|
||||
}
|
||||
|
||||
isFirstIt = false;
|
||||
|
||||
}
|
||||
|
||||
markdownBuilder.AppendLine("</table>");
|
||||
markdownBuilder.AppendLine("\n");
|
||||
|
||||
}
|
||||
|
||||
markdownBuilder.AppendLine($"# PLC Type Table");
|
||||
markdownBuilder.AppendLine($"Auto Generated @ **{DateTime.Now.ToUniversalTime().ToString("u", CultureInfo.InvariantCulture)}**\n");
|
||||
markdownBuilder.AppendLine(
|
||||
$"All supported PLC types for auto recognition are listed in this table. " +
|
||||
$"Other ones might also be supported but are shown as unknown in the library. " +
|
||||
$"Some models are never uniquely identifiable by their typecode and need extra hints like Prog Capacity in EXRT or RT. \n\n" +
|
||||
$"Typecode explained:\n" +
|
||||
$"```\n" +
|
||||
$"From left to right\n" +
|
||||
$"0x\n" +
|
||||
$"07 <= extended code (00 non mewtocol 7 devices)\n" +
|
||||
$"20 <= Is hex for 32 (Prog capacity)\n" +
|
||||
$"A5 <= Is the actual typecode, can overlap with others\n" +
|
||||
$"```"
|
||||
);
|
||||
|
||||
markdownBuilder.AppendLine($"> <b>Discontinued PLCs</b><br>");
|
||||
markdownBuilder.AppendLine($"> These are PLCs that are no longer sold by Panasonic. Marked with ⚠️\n");
|
||||
|
||||
markdownBuilder.AppendLine($"> <b>EXRT PLCs</b><br>");
|
||||
markdownBuilder.AppendLine($"> These are PLCs that utilize the basic `%EE#RT` and `%EE#EX00RT` command. All newer models do this. Old models only use the `%EE#RT` command.\n");
|
||||
|
||||
WritePlcTypeTable(plcNames);
|
||||
|
||||
File.WriteAllText(filePath, markdownBuilder.ToString());
|
||||
Reference in New Issue
Block a user