# AIM-tcp

Modbus TCP клиент для управления роботами CHAIFU и АИМ. Библиотека предоставляет простой интерфейс для чтения и записи регистров по протоколу Modbus TCP.

## Установка

Установка через пакетный менеджер [pip](https://pip.pypa.io/en/stable/).

```bash
pip install aim-tcp
```
## Подключение
```python
from aim_tcp import ModbusRobot
# Создаем объект робота
robot = ModbusRobot()
```
# Основные методы
## Запись в один регистр (16 бит) (FC06)
Стандартный регистр Modbus вмещает только 16 бит (максимум 65 535)
```python
robot.send_modbus_tcp(register=0x08, value=1) #записываем 1 в 8й регистр 
```
## Запись 32-битного значения (FC10)
Запись значения в два регистра  
Для управления роботом необходимо задать регистры в ячейки Reg ID
```python
robot.send_modbus_tcp_32bit(start_register=0x02, value=150000)
# Для числа 150000 (в шестнадцатеричном виде это 0x000249F0):
# High Word (Старшее слово): (150000 >> 16) = 2 (0x0002)
# Low Word (Младшее слово): 150000 & 0xFFFF = 18928 (0x49F0)
```
## Чтение регистров (FC04)
```python
robot.read_modbus_tcp_registers(register=0x01, count=12)
```
## Функция run_circle_motion 
Математика использует векторы для перемещения по окружности в 3D пространстве. Векторы vector_u и vector_v должны быть ортогональны (их скалярное произведение равно нулю)  
Плоскость XY (горизонтальная вдоль оси Z):
```vector_u = (1, 0, 0), vector_v = (0, 1, 0)```  
Плоскость XZ (вертикальная вдоль оси X):
```vector_u = (1, 0, 0), vector_v = (0, 0, 1)```  
Плоскость YZ (вертикальная вдоль оси Y):
```vector_u = (0, 1, 0), vector_v = (0, 0, 1)```  
Наклонная плоскость: задайте два вектора, которые лежат в нужной плоскости и перпендикулярны друг другу.
```python
robot.run_circle_motion(X0=300, Y0=500, Z0=1200, R=100, delay_ms=2, vector_u=(1, 0, 0), vector_v=(0, 0, 1), repeat_count=2)
```

## Визуализация позиции робота 
```python 
robot.visualize_robot_model() #вывод кинематической модели робота со слайдерами
robot.visualize_robot_model(5, 60.0, -45.0, 0.0, 90.0, 0.0) # вывод позиции с заданными углами
# ! подсчет XYZ может быть не точным
```

## Примечание: 
Библиотека разработана для работы с промышленными роботами, поддерживающими протокол Modbus TCP. Протестирована на оборудовании АМИ М25-Д1830.

# Пример
Для управления позицией робота необходимо запустить следующий скрипт
```
1 Condition: IF(R8==0),JudgeWhen(+:Block/-:msec)=0
2   DynPos:World Coor, Speed4200, Soft=1, XR=2, YR=3, ZR=4, AR=5, BR=6, CR=7
3   Set R:R8=1 RunWhen(+:Block/-:msec)=0
4 Condition: END_IF
*
```
И запустить его в бесконечно цикле  
  
Подключаем компьютер к контроллеру ethernet кабелем, в сетевых настройках компьютера задаем статический ipv4   192.168.18.*** <- любой ip отличный от робота, маска сети 255.255.255.0
#### python скрипт  
Приводим робота в точку с заданной ориентаций, проходим 2 круга в плоскости XY, возвращаемся в точку центра круга
```python
from aim_tcp import ModbusRobot
import time
robot = ModbusRobot() # по умолчанию подключение ip 192.168.18.201 port 502
robot.point_XYZ_ABC(300, 700, 1200, 0, 180, 0)
robot.run_circle_motion(X0=300, Y0=700, Z0=1200, R=100, delay_ms=50, vector_u=(1, 0, 0), vector_v=(0, 0, 1), repeat_count=2)
robot.point_XYZ_ABC(300, 700, 1200, 0, 180, 0)

```
## Лицензия

[MIT](https://choosealicense.com/licenses/mit/)