Skip to content

Commit

Permalink
Import ICP-CON project: setup binding devices to modules (#1435)
Browse files Browse the repository at this point in the history
```ChangeLog
Настройка привязки устройств к модулям при импортировании ICP-CON проектов;
```
  • Loading branch information
KirillGutyrchik authored Sep 24, 2024
1 parent 6854bf1 commit 6364e90
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 105 deletions.
14 changes: 5 additions & 9 deletions docs/user_manual/ReadMe.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,17 +274,16 @@ ProjectTestEnabled=True

#### 3.3.2 Как настроить правильную работу импорта проектов ####

Для корректной работы импорта описания старых проектов необходимо в файле конфигурации (`configuration.ini`) указать путь к EPLAN макросам модулей ввода-вывода, если такой настройки еще не установлено: необходимо в секции `[path]` добавить переменную `wago_macros_path = "ПУТЬ:\к\папке\с\макросами"`.
Для корректной работы импорта описания старых проектов необходимо в файле конфигурации (`configuration.ini`) указать путь к EPLAN макросам модулей ввода-вывода, если такой настройки еще не установлено: необходимо в секции `[path]` добавить переменную `wago_macros_path = "ДИСК:\путь\к\папке\с\макросами"`.

Сама папка с макросами должна быть структурирована в соответствие с последними изменениями в этой папке, а именно:
они должны быть разбиты по папкам соответствующим своим группам и именоваться по следующему формату `750-x00` (**x** - номер группы). Макрос выбирается по названию `WAGO.750-xyy.ema` (**xyy** - номер модуля).

Если у макроса есть какая-то модификация(вариация) типа `WAGO.750-xyy_025-000.ema`, то такой макрос выбран не будет, требуется строгое название макроса, который будет использоваться.


#### 3.3.3 Как импортировать описание старого проекта ####

Для импортирования описания старого проекта необходимо в меню выбрать следующую функцию: `EPlaner` -> `Импорт модулей ICP-CON проекта`.
Для импортирования описания старого проекта необходимо в меню выбрать следующую функцию: `EPlaner` -> `Импорт ICP-CON проекта`.
В открывшемся окне проводника необходимо выбрать файл проекта `main.wago.plua`. После этого начнется импорт старого проекта.

Примечания по импорту проекта:
Expand All @@ -302,15 +301,12 @@ ProjectTestEnabled=True

<p align="center"><b>Рисунок</b> - <i>Структура импортированного проекта</i></p>

- В результате импорта узлов и модулей ввода вывода получаются страницы шин ПЛК и страницы с клеммами. Примеры можно увидеть на рисунках ниже:

<p align="center"><img src="images/import_plc_bus.png"></p>
- Устройства ввода-вывода импортируются с разделением по объектам в местах установки (EPLAN) по аналогии с модулями. Места установки не всегда правильно расшифровываются, и под каждым устройством указан комментарий из ICP-CON, по нему можно сверять корректность.

<p align="center"><b>Рисунок</b> - <i>Пример сгенерированной страницы с шиной ПЛК</i></p>
- После импорта устройств и модулей, настраивается привязка их привязка.

<p align="center"><img src="images/import_clamps.png"></p>
- В логах указываются некоторые ошибки при импортировании проекта.

<p align="center"><b>Рисунок</b> - <i>Сгенерированные страницы с клеммами</i></p>

## 4 Оборудование IO ##

Expand Down
Binary file removed docs/user_manual/images/import_clamps.png
Binary file not shown.
Binary file removed docs/user_manual/images/import_plc_bus.png
Binary file not shown.
Binary file modified docs/user_manual/images/imported_pages_explorer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions src/EasyEPlanner.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
Expand Down Expand Up @@ -114,7 +114,8 @@
<Compile Include="ColumnNode.cs" />
<Compile Include="Configuration\ConfigurationChecker.cs" />
<Compile Include="Configuration\DeviceSynchronizeService.cs" />
<Compile Include="Main\ImportIcpWagoDevicesAction.cs" />
<Compile Include="Main\ImportIcpWagoProjectAction.cs" />
<Compile Include="ProjectImportICP\BindingImporter.cs" />
<Compile Include="ProjectImportICP\DevicesImporter.cs" />
<Compile Include="Device\IDevice.cs" />
<Compile Include="Device\IIOChannel.cs" />
Expand Down Expand Up @@ -221,7 +222,6 @@
<Compile Include="IO\IIOModule.cs" />
<Compile Include="IO\IIONode.cs" />
<Compile Include="IO\IOModuleInfo.cs" />
<Compile Include="Main\ImportIcpWagoModulesAction.cs" />
<Compile Include="Main\InterprojectExchangeAction.cs" />
<Compile Include="Configuration\ProjectHealthChecker.cs" />
<Compile Include="Device\DeviceManager.cs" />
Expand Down
12 changes: 3 additions & 9 deletions src/Main/AddInModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,9 @@ public bool OnInitGui()
false, false);

menuID = oMenu.AddMenuItem(
"Импорт устройств ICP-CON проекта",
"ImportIcpWagoDevices",
"Импорт устройств ICP-CON проекта", menuID, 1,
false, false);

menuID = oMenu.AddMenuItem(
"Импорт модулей ICP-CON проекта",
"ImportIcpWagoModules",
"Импорт модулей ICP-CON проекта", menuID, 1,
"Импорт ICP-CON проекта",
"ImportIcpWagoProject",
"Импорт ICP-CON проекта", menuID, 1,
false, false);

menuID = oMenu.AddMenuItem(
Expand Down
78 changes: 0 additions & 78 deletions src/Main/ImportIcpWagoDevicesAction.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
namespace EasyEPlanner
{
[ExcludeFromCodeCoverage]
public class ImportIcpWagoModulesAction : IEplAction
public class ImportIcpWagoProjectAction : IEplAction
{
~ImportIcpWagoModulesAction() { }
~ImportIcpWagoProjectAction() { }

public bool Execute(ActionCallingContext oActionCallingContext)
{
Expand All @@ -43,7 +43,7 @@ public bool Execute(ActionCallingContext oActionCallingContext)

if (openFileDialog.ShowDialog() == DialogResult.Cancel)
{
return true;
return true;
}

var data = "";
Expand All @@ -55,6 +55,11 @@ public bool Execute(ActionCallingContext oActionCallingContext)

var modulesImporter = new ModulesImporter(currentProject, data);
modulesImporter.Import();

var devicesImporter = new DevicesImporter(currentProject, data);
devicesImporter.Import();

new BindingImporter(modulesImporter.ImportModules, devicesImporter.ImportDevices).Bind();
}
catch (Exception ex)
{
Expand All @@ -66,7 +71,7 @@ public bool Execute(ActionCallingContext oActionCallingContext)

public bool OnRegister(ref string Name, ref int Ordinal)
{
Name = "ImportIcpWagoModules";
Name = "ImportIcpWagoProject";
Ordinal = 30;

return true;
Expand Down
70 changes: 70 additions & 0 deletions src/ProjectImportICP/BindingImporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EasyEPlanner.ProjectImportICP
{
/// <summary>
/// Импортер привязки устройств к модулям
/// </summary>
[ExcludeFromCodeCoverage]
public class BindingImporter
{
private readonly Dictionary<int, List<ImportModule>> modules;
private readonly List<ImportDevice> devices;


public BindingImporter(Dictionary<int, List<ImportModule>> modules, List<ImportDevice> devices)
{
this.modules = modules;
this.devices = devices;
}

/// <summary>
/// Настроить привязку импортированных устройств к модулям
/// </summary>
public void Bind()
{
Logs.AddMessage("\n\n");
Logs.AddMessage("Настройка привязки устройств к модулям:\n");

foreach (var device in devices)
{
foreach (var channel in device.Channels)
{
var node = modules[channel.node + 1];

var offset = channel.offset;

foreach (var module in node.Where(m => m.ModuleInfo.AddressSpaceType.ToString().Contains(channel.type)))
{
if (offset - module.AddressSpace(channel.type) >= 0)
{
offset -= module.AddressSpace(channel.type);
continue;
}

if (module.Clamps.TryGetValue(offset, out var clamp))
{
clamp.LockObject();

clamp.Properties.FUNC_TEXT = $"+{device.Object}-{device.Type}{device.Number}\r\n" +
$"{device.Description}\r\n" +
$"{channel.comment}";

Logs.AddMessage($"\tКанал {device.Object}{device.Type}{device.Number}:{channel.type}{channel.comment}" +
$" привязан к клемме {module.Function.VisibleName}:{clamp.Properties.FUNC_ADDITIONALIDENTIFYINGNAMEPART}\n");
}
else
Logs.AddMessage($"\tНе удалось привязать канал {device.Object}{device.Type}{device.Number}:{channel.type}{channel.comment}\n");

break;
}
}
}
}
}
}
7 changes: 6 additions & 1 deletion src/ProjectImportICP/ImportModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public interface IImportModule
[ExcludeFromCodeCoverage]
public class ImportModule : IImportModule
{
public ImportModule(List<Terminal> clamps, IOModuleInfo moduleInfo)
public ImportModule(List<Terminal> clamps, IOModuleInfo moduleInfo, PLC function)
{
foreach (var clamp in clamps)
{
Expand All @@ -58,6 +58,7 @@ public ImportModule(List<Terminal> clamps, IOModuleInfo moduleInfo)
}
}

Function = function;
ModuleInfo = moduleInfo;

addressSpace["AO"] = ModuleInfo.AOCount;
Expand All @@ -70,8 +71,12 @@ public ImportModule(List<Terminal> clamps, IOModuleInfo moduleInfo)

private readonly Dictionary<int, Terminal> clamps = new Dictionary<int, Terminal>();

public Dictionary<int, Terminal> Clamps => clamps;

public IOModuleInfo ModuleInfo { get; private set; }

public PLC Function { get; private set; }

public int AddressSpace(string channelType)
=> addressSpace[channelType];
}
Expand Down
2 changes: 1 addition & 1 deletion src/ProjectImportICP/ModulesImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ public bool ImportModule(int moduleN, int nodeIndex, int moduleIndex)
if (moduleN != 600) // exclude end module
{
var clamps = CreatePageWithModuleClamps(macro, moduleInfo, moduleNumber);
ImportModules[nodeIndex].Add(new ImportModule(clamps, moduleInfo));
ImportModules[nodeIndex].Add(new ImportModule(clamps, moduleInfo, module));
}

Logs.AddMessage($"\t-A{moduleNumber} [ {moduleInfo.Name} ] {(isStub ? "Неопределенный модуль" : moduleInfo.Description)};\n");
Expand Down

0 comments on commit 6364e90

Please sign in to comment.