#include "modbus_form.h" #include "lua_bind.h" #include "msgdef.h" #include ModbusMasterForm::ModbusMasterForm(ui::Window* hwnd, std::wstring name, uint32_t baurate, UINT portnum, uint8_t data_bits, uint8_t stop_bits, uint8_t verify, uint8_t flow_control) :m_rich_edit_1(nullptr), m_rich_edit_2(nullptr), m_rich_edit_3(nullptr) { m_portnum = portnum; m_name = name; m_baurate = baurate; m_data_bits = data_bits; m_stop_bits = stop_bits; m_verify = verify; m_flow_contro = flow_control; m_runing = true; mLua = new LuaDelegate; mLuaFile.open(MODBUS_LUA_SCRIPT); std::string lua_script; if (mLuaFile.is_open()) { std::string s; while (getline(mLuaFile, s)) { lua_script += s + "\r\n"; } mLuaFile.close(); } mLuaScript = lua_script; mLua->DoString(lua_script); std::cout << "lua script is " << lua_script << std::endl; if (nullptr != hwnd) { // set window so we get getwindow by GetWindow funtion this->SetWindow(hwnd, nullptr, false); } this->mLua->BindFunction("showdata", LuaShowData); } ModbusMasterForm::~ModbusMasterForm() { } void ModbusMasterForm::Init() { ui::ChildBox::Init(); auto mRightSide = dynamic_cast (FindSubControl(L"uart_info_label")); wchar_t p[100] = { 0 }; wsprintf(p, L"串口号: %s 波特率%d 数据位: %d 停止位: %d ", m_name.c_str(), m_baurate, m_data_bits, m_stop_bits); mRightSide->SetText(std::wstring(p)); m_rich_edit_1 = dynamic_cast(FindSubControl(L"read_single_addr")); m_button_1 = dynamic_cast(FindSubControl(L"btn_send_modbus")); m_rich_edit_2 = dynamic_cast(FindSubControl(L"read_batch_addr")); m_rich_edit_3 = dynamic_cast(FindSubControl(L"read_batch_cnt")); auto mBtnSend = static_cast(FindSubControl(L"btn_send_modbus")); auto mBtnSend2 = static_cast(FindSubControl(L"btn_send_modbus_batch")); if (NULL != mBtnSend) { mBtnSend->AttachClick([this](ui::EventArgs*){ wprintf(L"com is %s m_name", m_name.c_str()); printf("open ptr is %s %d %d %d ", wstring2string(m_name).c_str(), m_baurate,m_data_bits,m_stop_bits); mModbus = modbus_new_rtu(wstring2string(wstring(L"\\\\.\\") + m_name).c_str(), m_baurate,'N',m_data_bits, m_stop_bits); if (mModbus != nullptr) { modbus_set_slave(mModbus, 9); modbus_set_debug(mModbus,true); int ret = modbus_connect(mModbus); if (ret < 0) { printf("modbus_connect err %d\r\n", ret); } timeval* ptr = new timeval; ptr->tv_sec = 1; ptr->tv_usec = 0; modbus_set_response_timeout(mModbus, ptr); uint16_t dest[32]; uint16_t addr = 0; if (m_rich_edit_1) { int i = 0; nbase::StringToInt(m_rich_edit_1->GetText(),&i); addr = uint16_t(i); } ret = modbus_read_registers(mModbus, addr, 1, dest); if (ret < 0) { printf("read %d timeout %d ", ret); }else { for (int i = 0; i < ret; i++) { ui::ListContainerElement* element = new ui::ListContainerElement; element->SetText(nbase::StringPrintf(L"地址%d: %d", addr + i,dest[i])); element->SetClass(L"listitem"); element->SetFixedHeight(30); element->SetFont(L"system_20"); m_list->RemoveAll(); m_list->Add(element); } } std::string str; modbus_flush(mModbus); modbus_close(mModbus); } return false; }); } m_list = dynamic_cast(FindSubControl(L"list")); if (nullptr != mBtnSend2) { mBtnSend2->AttachClick([this](ui::EventArgs* arg) { uint16_t addr = 0; uint16_t cnt = 0; if (m_rich_edit_2) { int i = 0; nbase::StringToInt(m_rich_edit_2->GetText(), &i); addr = uint16_t(i); } if (m_rich_edit_3) { int i = 0; nbase::StringToInt(m_rich_edit_3->GetText(), &i); cnt = uint16_t(i); } wprintf(L"com is %s m_name", m_name.c_str()); printf("open ptr is %s %d %d %d ", wstring2string(m_name).c_str(), m_baurate, m_data_bits, m_stop_bits); mModbus = modbus_new_rtu(wstring2string(wstring(L"\\\\.\\") + m_name).c_str(), m_baurate, 'N', m_data_bits, m_stop_bits); if (mModbus != nullptr) { modbus_set_slave(mModbus, 9); modbus_set_debug(mModbus, true); int ret = modbus_connect(mModbus); if (ret < 0) { printf("modbus_connect err %d\r\n", ret); } timeval* ptr = new timeval; ptr->tv_sec = 1; ptr->tv_usec = 0; modbus_set_response_timeout(mModbus, ptr); uint16_t dest[32]; ret = modbus_read_registers(mModbus, addr, cnt, dest); if (ret < 0) { printf("read %d timeout %d ", ret); } else { m_list->RemoveAll(); for (int i = 0; i < ret; i++) { ui::ListContainerElement* element = new ui::ListContainerElement; element->SetText(nbase::StringPrintf(L"地址%d: %d", addr + i, dest[i])); element->SetClass(L"listitem"); element->SetFixedHeight(30); element->SetFont(L"system_20"); m_list->Add(element); } } std::string str; modbus_flush(mModbus); modbus_close(mModbus); } return true; }); } } void ModbusMasterForm::UpdateRecvEdit() { } LuaDelegate* ModbusMasterForm::LuaVM() { return nullptr; } void ModbusMasterForm::ShowDataInEdit(const char*) { } void ModbusMasterForm::OnUpdateUart() { } void ModbusMasterForm::HandleMessage(ui::EventArgs& msg) { }