Api_V2
V2源码发布版Sdk和V1动态库发布版的差异
除了轴创建函数外并无其他不同。
V2源码发布版Sdk的目的
主要是为了解决以下问题
- V1版Sdk的共享库发布模式不方便用户深度集成
- 存在共享库跨平台兼容性问题
- c#/py等接口下的dll/config路径配置生产环境增加发布难度
- V1版Sdk中存在对RM CanOpen轴的通讯控制, 而CanOpen部分功能依赖于专用RMCanOpen调试器 不方便用户集成自己的硬件。
V2源码发布包的结构
根目录结构
路径 | 功能 |
---|---|
/sdk_common/ | sdk本体的c++11源码 |
/sdk_c/ | sdk的c99接口导出 |
/sdk_csharp/ | sdk的c#接口导出, 基于clr类 |
/sdk_py/ | sdk的py接口导出 |
/sdk_node/ | sdk的node接口导出 |
/sdk_java/ | sdk的java接口导出, 基于jni接口 |
/sdk_语言接口/ | 待添加的其他接口支持 |
Sdk功能介绍
文件 | 功能 |
---|---|
/sdk_common/libmodbus | 依赖的modbus通讯库, lgplv2协议 |
/sdk_common/Config | 控制器寄存器地址配置等, 如需修改点位指令占用等修改此文件 |
/sdk_common/Exception | 通讯等异常抛出实现, 如需自定义异常可修改此文件 |
/sdk_common/Modbus | Modbus通讯库的简易封装 |
/sdk_common/RMAxis | RM轴动作的封装 |
V2源码发布包的使用方法
- c++用户, 可以直接把sdk_common文件夹下的源码直接全部引入到工程文件中去, 然后包含RMAxis.h头文件即可使用
- c用户可以用/sdk_c/文件夹下的cmake生成并编译一个动态库导出给c项目使用
- c#用户, 打开/sdk_csharp/sdk_csharp.vcxproj工程文件, 右键项目属性配置所需要使用的x86/x64还有.net framework版本等, 确认后编译, 即可在生成文件夹获得编译出来的Sdk库dll文件。 在要使用的sdk的项目中右键添加引用并选中生成的dll即可。
- python用户, 在sdk_py文件夹下执行 sudo python3 setup.py install , 即可触发setup_tool 的自动编译安装, 自动编译安装成功后在python3 repl环境下 直接键入 import motormaster 即可导入sdk包。
import motormaster
axis = motormaster.create_axis_modbus_rtu('/dev/ttyUSB0', 115200, 0')
print(axis.get_version())
C++用户需要注意编译器需要支持最低c++11标准。
Linux Python用户需要注意, 使用setup_tool, 需要确保build_essentials和cmake已经安装, windows用户同样需要确保msvc和cmake的安装。
RMAxis类功能实现简介
对RM控制器的控制主要依赖于
- 对IO线圈寄存器的操作(触发执行/停止等动作)
- 对保持寄存器的读写(位置/推力等数据)
以回原点的实现为例
void RMAxis::go_home()
{
this->set_input_signal("go_home", false);
std::this_thread::sleep_for(IO_GAP_TIME);
this->set_input_signal("go_home", true);
}
- 设置输入io信号"go_home" 为低
- 等待IO_GAP_TIME, 约10ms 消抖时间
- 再次设置输入io信号"go_home" 为高, 以上升沿触发 执行回原点操作
以触发特定index的点位指令的实现为例
void RMAxis::trig_command(int index)
{
this->set_parameter<int>("selected_command_index", index);
this->set_input_signal("start", false);
std::this_thread::sleep_for(IO_GAP_TIME);
this->set_input_signal("start", true);
}
- 写入保持寄存器"selected_command_index" 为 要触发的指令序号
- 设置输入io信号"start" 为低
- 等待IO_GAP_TIME, 约10ms 消抖时间
- 再次设置输入io信号"start" 为高, 以上升沿触发 执行点位指令操作
Config.h的配置自定义
- IO消抖时间
#define IO_GAP_TIME 10ms
因RM控制器的IO寄存器存在和外部IO映射的关系, 一般情况下为10ms, 如遇到通讯无法触发IO或者在极高速通讯时IO读写无动作的情况可以适当改大该值范围在 10ms ~ 100ms之间。
- SDK指令占用的控制器点位指令槽
#define EXECUTE_COMMAND_INDEX 15
#define COMMAND_REACH_SIGNAL "reach_15"
SDK执行绝对运动/相对运动/推压运动等时占用的控制器点位表位置, 默认情况为点位表最后一位第15条指令, 并以第15条指令到位为到位信号, 如有特殊需求可以修改该位置范围0~15。
- SDK所使用的参数
inline void init_parameters(std::map<std::string, param_t>& params)
{
params["current_command_position"] = { PARAM_FLOAT, PARAM_NORMAL, 4902 };
// ...
}
该函数会在sdk被初始化的时候调用, 并初始化参数表的地址。 params["参数名字"] = { 参数数据类型, 参数编辑级别, 参数地址 } 一般情况下无需对其做出改动, 如有变更需要联系技术售服协助修改。
连接轴
// 函数原型
rm_handle_t rm_create_modbus_rtu(const char* device, int baudrate, uint8_t slave_id);
rm_handle_t rm_create_modbus_tcp(const char* address, int port, uint8_t slave_id);
// 使用示例
rm_axis_handle handle = rm_create_modbus_rtu("\\\\.\\COM8", 115200, 0);
rm_axis_handle handle = rm_create_modbus_tcp("192.168.50.9", 502, 0);
// 函数原型
static RMAxis* create_rmaxis_modbus_rtu(std::string device, int baudrate, uint8_t slave_id);
static RMAxis* create_rmaxis_modbus_tcp(std::string address, int port, uint8_t slave_id);
// 使用示例
auto axis = RMAxis::create_rmaxis_modbus_rtu("\\\\.\\COM8", 115200, 0);
auto axis = RMAxis::create_rmaxis_modbus_tcp("192.168.50.9", 502, 0);
// 函数原型
public static Axis CreateModbusRtu(string device, int baudrate, ushort slave_id);
public static Axis CreateModbusTcp(string address, int port, ushort slave_id);
// 使用示例
var axis = Axis.CreateModbusRtu("\\\\.\\COM8", 115200, 0);
var axis = Axis.CreateModbusTcp("192.168.50.9", 502, 0);
## 函数原型
def create_axis_modbus_rtu(device, baudrate, axis_no):
def create_axis_modbus_tcp(address, port, slave_id):
## 使用示例
axis = sdk.create_axis_modbus_rtu('\\\\.\\COM8', 115200, 0)
axis = sdk.create_axis_modbus_tcp('192.168.50.9', 502, 0)
变量 | 描述 |
---|---|
device | 串口设备 \\.\COM8 或 /dev/ttyS0 等 |
baudrate | 波特率 |
slave_id | 轴号 |
变量 | 描述 |
---|---|
address | ip地址 |
port | 端口 |
slave_id | 轴号 |
连接到指定设备上的控制器。