|
|
#include "stdio.h"
|
|
|
#include "PLCDevice.h"
|
|
|
#include <iostream>
|
|
|
#include <common.h>
|
|
|
#include <QDebug>
|
|
|
|
|
|
extern SysConf g_sys_conf;
|
|
|
|
|
|
bool PLCDevice::init_plc(PLCDevice* PLCptr)
|
|
|
{
|
|
|
// modbus_connect() 建立连接,成功返回0,错误返回-1
|
|
|
// modbus_new_rtu 生成RTU的连接,建立成功则返回指向modbus_t结构的指针,否则将返回NULL/0
|
|
|
|
|
|
const char* comport = g_sys_conf.ComPort.data();
|
|
|
qDebug() << "COM:" << comport;
|
|
|
//连接PLC
|
|
|
PLCptr->g_modbus = modbus_new_rtu(comport, 9600, 'N', 8, 1);
|
|
|
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位,flag=1时显示modbus消息的字节
|
|
|
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
|
|
|
modbus_connect(PLCptr->g_modbus);
|
|
|
modbus_set_slave(PLCptr->g_modbus, 1); // 设置从站id
|
|
|
|
|
|
uint8_t data;
|
|
|
int ret = modbus_read_bits(PLCptr->g_modbus, 30000, 1, &data);
|
|
|
if (PLCptr->g_modbus && ret == -1) {
|
|
|
PLCptr->g_plc_ok = false;
|
|
|
}
|
|
|
else {
|
|
|
|
|
|
PLCptr->g_plc_ok = true;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
bool PLCDevice::init_plc_tcp(PLCDevice* PLCptr)
|
|
|
{
|
|
|
#ifdef __ModebusServer
|
|
|
PLCptr->g_modbus = modbus_new_tcp("192.168.1.200", 2000);
|
|
|
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位,flag=1时显示modbus消息的字节
|
|
|
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
|
|
|
modbus_connect(PLCptr->g_modbus);
|
|
|
modbus_set_slave(PLCptr->g_modbus, 1); // 设置从站id
|
|
|
|
|
|
uint8_t data;
|
|
|
int ret = modbus_read_bits(PLCptr->g_modbus, 30000, 1, &data);
|
|
|
// 连接失败
|
|
|
if (-1 == ret)
|
|
|
{
|
|
|
PLCptr->g_plc_ok = false;
|
|
|
qDebug("TCP connect failed:%s\n", modbus_strerror(errno));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
PLCptr->g_plc_ok = true;
|
|
|
qDebug("TCP connect successful ");
|
|
|
}
|
|
|
#endif
|
|
|
#ifdef __ModebusClient
|
|
|
|
|
|
PLCptr->g_modbus = modbus_new_tcp("127.0.0.1", 502);
|
|
|
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位,flag=1时显示modbus消息的字节
|
|
|
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
|
|
|
// 侦听主站连接
|
|
|
PLCptr->m_modbusSocket = modbus_tcp_listen(PLCptr->g_modbus, 1); // 最多支持的主机数量 1
|
|
|
/*设置线圈, 离散输入, 输入寄存器, 保持寄存器个数(数组元素个数))*/
|
|
|
PLCptr->mapping = modbus_mapping_new(PLCptr->m_numBits, PLCptr->m_numInputBits, PLCptr->m_numInputRegisters, PLCptr->m_numRegisters);
|
|
|
if (PLCptr->mapping == NULL)
|
|
|
{
|
|
|
fprintf(stderr, "Unable to assign mapping:%s\n", modbus_strerror(errno));
|
|
|
modbus_free(PLCptr->g_modbus);
|
|
|
PLCptr->m_initialized = false;
|
|
|
return false;
|
|
|
}
|
|
|
PLCptr->m_initialized = true;
|
|
|
#endif
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
bool PLCDevice::disconnect_plc(void)
|
|
|
{
|
|
|
if (g_modbus)
|
|
|
{
|
|
|
modbus_close(g_modbus);
|
|
|
modbus_free(g_modbus);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
int PLCDevice::write_bit_2_plc(int addr, int value)
|
|
|
{
|
|
|
if (g_plc_ok)
|
|
|
{
|
|
|
g_mutex.lock();
|
|
|
int ret = modbus_write_bit(g_modbus, addr, value);
|
|
|
g_mutex.unlock();
|
|
|
//printf("modbus_write_bit:addr=%d,value=%d,ret=%d\n", addr, value, ret);
|
|
|
return ret;
|
|
|
}
|
|
|
else {
|
|
|
//std::cout << "PLC no ok" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int PLCDevice::read_bits_from_plc(int addr, int nb, uint8_t* value)
|
|
|
{
|
|
|
if (g_plc_ok)
|
|
|
{
|
|
|
g_mutex.lock();
|
|
|
int ret = modbus_read_bits(g_modbus, addr, nb, value);
|
|
|
g_mutex.unlock();
|
|
|
//printf("modbus_read_bits:addr=%d,nb=%d,value=%d,ret=%d\n", addr, nb, *value, ret);
|
|
|
return ret;
|
|
|
}
|
|
|
else {
|
|
|
//std::cout << "PLC no ok" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int PLCDevice::write_short_2_plc(int addr, int nb, uint16_t* value)
|
|
|
{
|
|
|
if (g_plc_ok)
|
|
|
{
|
|
|
g_mutex.lock();
|
|
|
int ret = modbus_write_registers(g_modbus, addr, nb, value);
|
|
|
g_mutex.unlock();
|
|
|
//printf("modbus_write_registers:addr=%d,nb=%d,value=%d,ret=%d\n", addr, nb, *value, ret);
|
|
|
return ret;
|
|
|
}
|
|
|
else {
|
|
|
//std::cout << "PLC no ok" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int PLCDevice::read_short_from_plc(int addr, int nb, uint16_t* value)
|
|
|
{
|
|
|
if (g_plc_ok)
|
|
|
{
|
|
|
g_mutex.lock();
|
|
|
int ret = modbus_read_registers(g_modbus, addr, nb, value);
|
|
|
g_mutex.unlock();
|
|
|
//printf("modbus_read_registers:addr=%d,nb=%d,value=%d,ret=%d\n", addr, nb, *value ,ret);
|
|
|
return ret;
|
|
|
}
|
|
|
else {
|
|
|
//std::cout << "PLC no ok" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int PLCDevice::write_2_plc(int addr, int nb, uint16_t* value)
|
|
|
{
|
|
|
if (g_plc_ok)
|
|
|
{
|
|
|
//g_mutex.lock();
|
|
|
int ret = modbus_write_registers(g_modbus, addr, nb, value);
|
|
|
//g_mutex.unlock();
|
|
|
//printf("modbus_write_registers:addr=%d,nb=%d,value=%d,ret=%d\n", addr, nb, *value, ret);
|
|
|
return ret;
|
|
|
}
|
|
|
else {
|
|
|
//std::cout << "PLC no ok" << std::endl;
|
|
|
return false;
|
|
|
}
|
|
|
} |