Использование XML и добавление в него c# logi c для настройки - PullRequest
1 голос
/ 06 августа 2020

Я работаю над программным обеспечением для настройки устройства для связи через 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 для выполнения и оценки кода после синтаксического анализа.

Я хотел бы знать ваши мысли, и если вы знаете о лучший подход к этому делу. У меня есть проблема с тем, что у меня ограниченные способы предотвращения проникновения вредоносного кода. Однако код работает только на локальном компьютере, а не в облаке или на другом сервере, поэтому вы испортите только свое собственное устройство. .

...