Я работаю над программным обеспечением для настройки устройства для связи через CANOpen. В CANOpen существует концепция объектного словаря (OD), который используется совместно потребителем и производителем. Он действует как контракт между конечными точками связи.
Чтобы настроить то, что мы хотим визуализировать в нашем приложении, мы создаем файл конфигурации в XML. Одним из примеров являются команды, которые могут выполняться на устройстве. Например, вам нужно переместить руку робота на 500 мм. Затем я хочу иметь возможность определить эту команду как «Move Arm Z-Axis» и указать параметр определенного типа c с определенными ограничениями (min, max, et c).
подход, который я хочу использовать, - использовать файл xml для каждого устройства, в котором можно определить все эти шаги. Однако это требует, чтобы я написал код c# внутри xml с использованием специальных правил синтаксического анализа c, например, любой код должен быть между скобками "{{" "}}" или использовать определенные элементы c (например, <SetVariable>
).
<?xml version="1.0" encoding="UTF-8"?>
<DeviceConfiguration>
<Device name="CanOpenDevice1" />
<ParameterConfiguration>
<EntreesToExclude>
<EntryToExclude Index="0x206B" />
<EntryToExclude Index="0x2050" />
<EntryToExclude Index="0x20F1" />
<EntryToExclude Index="0x20F4" />
</EntreesToExclude>
<WriteToFlashCommand>
<WriteCommand Label="Write to Flash" Index="0x3000" SubIndex="0x0F" Value="0x000000FF" />
</WriteToFlashCommand>
</ParameterConfiguration>
<CommandConfiguration>
<Commands>
<WriteCommand Label="Connect Request ON" Index="0x20F2" Value="true" DataType="bool" />
<WriteCommand Label="Connect Request OFF" Index="0x20F2" Value="false" DataType="bool" />
<WriteCommand Label="Clear Faults" Index="0x2050" SubIndex="0x01" Value="0x66726c63" DataType="uint" />
<WriteCommand Label="Reboot" Index="0x2050" SubIndex="0x02" Value="0x00747372" DataType="uint" />
<!-- Executes in sequential order -->
<CommandInstructionSet Label="Sync RTC">
<SetVariable Name="now" Value="{{System.Datetime.UtcNow}}" />
<WriteCommand Index="0x206B" SubIndex="0x05" Value="{{$now.Second}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x06" Value="{{$now.Minute}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x07" Value="{{$now.Hour}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x08" Value="{{$now.Day}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x09" Value="{{$now.Month}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x0A" Value="{{$now.Year - 2000}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x0B" Value="{{System.DateTime.IsLeapYear($now.Year)}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x0C" Value="{{$now.DayOfWeek}}" DataType="ushort" />
<WriteCommand Index="0x206B" SubIndex="0x0E" Value="0x12345678" DataType="uint" />
</CommandInstructionSet>
<ReadCommand Label="Reboot" Index="0x2050" SubIndex="0x02" DataType="uint" />
</Commands>
</CommandConfiguration>
</DeviceConfiguration>
Идея состоит в том, чтобы использовать api сценариев Roslyn для выполнения и оценки кода после синтаксического анализа.
Я хотел бы знать ваши мысли, и если вы знаете о лучший подход к этому делу. У меня есть проблема с тем, что у меня ограниченные способы предотвращения проникновения вредоносного кода. Однако код работает только на локальном компьютере, а не в облаке или на другом сервере, поэтому вы испортите только свое собственное устройство. .