This commit is contained in:
zhouhuang 2024-10-29 12:52:52 +08:00
parent 8e3e084954
commit 3c910cfdc8
7 changed files with 366 additions and 145 deletions

View File

@ -1,4 +1,5 @@
#include "ry.h" #include "ry.h"
#include <math.h>
CRYDevice::CRYDevice() CRYDevice::CRYDevice()
{ {
@ -275,10 +276,12 @@ BOOLEAN CRYDevice::websocket_msg_join(noPollMsg **msg, int msg_count, BYTE* &buf
len += nopoll_msg_get_payload_size(msg[i]); len += nopoll_msg_get_payload_size(msg[i]);
} }
buffer[buffer_size] = 0; buffer[buffer_size] = 0;
vLog(LOG_DEBUG, "buffer size is: %ld.\n", buffer_size);
return TRUE; return TRUE;
} }
int CRYDevice::websocket_write(noPollConn* conn, const char * buffer, int buffer_len) int CRYDevice::websocket_write(const char * buffer, int buffer_len)
{ {
int result; int result;
result = nopoll_conn_send_text(conn, (const char *)buffer, buffer_len); result = nopoll_conn_send_text(conn, (const char *)buffer, buffer_len);
@ -287,7 +290,7 @@ int CRYDevice::websocket_write(noPollConn* conn, const char * buffer, int buffer
return (result == buffer_len) ? 0 : -1; return (result == buffer_len) ? 0 : -1;
} }
bool CRYDevice::publish_sensor_data(noPollConn* conn, const std::string traceId, const char* command, const Json::Value payload) bool CRYDevice::publish_sensor_data(const std::string traceId, const char* command, const Json::Value payload)
{ {
Json::StreamWriterBuilder builder; Json::StreamWriterBuilder builder;
builder["indentation"] = ""; builder["indentation"] = "";
@ -311,8 +314,11 @@ bool CRYDevice::publish_sensor_data(noPollConn* conn, const std::string traceId,
jsonRoot["data"] = payload; jsonRoot["data"] = payload;
std::string outputConfig = Json::writeString(builder, jsonRoot); std::string outputConfig = Json::writeString(builder, jsonRoot);
vLog(LOG_DEBUG, "send cmd: %s, payload: %d\n", command, outputConfig.length()); if (traceId != "")
int rc = websocket_write(conn, outputConfig.c_str(), outputConfig.length()); {
vLog(LOG_DEBUG, "send cmd: %s, payload: %d, %128s\n", command, outputConfig.length(), outputConfig.c_str());
}
int rc = websocket_write(outputConfig.c_str(), outputConfig.length());
if (rc != 0) { if (rc != 0) {
vLog(LOG_DEBUG, "websocket write is error<%d>,insert into database.\n", rc); vLog(LOG_DEBUG, "websocket write is error<%d>,insert into database.\n", rc);
//插入数据库 //插入数据库
@ -340,7 +346,39 @@ int CRYDevice::GetUnitYMCount(int uid)
return config.units[uid].ymcount; return config.units[uid].ymcount;
} }
float CRYDevice::GetUnitYCReal(int uid, int order) LONG CRYDevice::GetUnitYC(int uid, int order) const
{
int udb;
LONG value;
struUnit* pUnit;
struUnitYC* pYC;
if (uid < 0 || uid >= UNIT_NUM) return 0;
pUnit = &config.units[uid];
if ((pUnit->state & 0x01) != TRUE) return 0;
if (order < 0 || order >= pUnit->yccount) return 0;
pYC = &pUnit->ycs[order];
udb = pYC->order;
if (udb < 0 || udb >= DATABASE_YC_NUM)
{
value = pYC->value;
}
else
{
value = database.ycs[udb].value;
pYC->value = value;
pYC->update_time = database.ycs[udb].update_time;
pYC->qds = database.ycs[udb].qds;
}
if (pYC->factor > 1 && (pUnit->type & 0x0f) == 0x00)
{ //系数有效,且为转发单元
value /= pYC->factor;
}
return value;
}
float CRYDevice::GetUnitYCReal(int uid, int order) const
{ {
int udb; int udb;
long value; long value;
@ -369,7 +407,7 @@ float CRYDevice::GetUnitYCReal(int uid, int order)
return (float)((float)value * coef + base); return (float)((float)value * coef + base);
} }
float CRYDevice::GetUnitYCRealFromValue(int uid, int order, long value) float CRYDevice::GetUnitYCRealFromValue(int uid, int order, long value) const
{ {
int udb; int udb;
float coef; float coef;
@ -393,6 +431,64 @@ float CRYDevice::GetUnitYCRealFromValue(int uid, int order, long value)
return (float)(value * coef + base); return (float)(value * coef + base);
} }
BOOLEAN CRYDevice::GetUnitYCIsFloat(int uid, int order) const
{
int udb;
float coef = 1.0f;
struUnit* pUnit;
struUnitYC* pYC;
if (uid < 0 || uid >= UNIT_NUM) return 0;
pUnit = &config.units[uid];
if ((pUnit->state & 0x01) != TRUE) return 0;
if (order < 0 || order >= pUnit->yccount) return 0;
pYC = &pUnit->ycs[order];
udb = pYC->order;
if (udb < 0 || udb >= DATABASE_YC_NUM)
{
coef = 1.0f;
}
else
{
coef = pYC->coef;
}
if (fabsf(coef) <= 1E-8) coef = 1.0f;
if (fabsf(coef - 1.0f) <= 1E-8) return FALSE;
return TRUE;
}
float CRYDevice::GetUnitYCLimitReal(int uid, int order, int type) const
{
float limitValue;
struUnit* pUnit;
struUnitYC* pYC;
if (uid < 0 || uid >= UNIT_NUM) return 0;
pUnit = &config.units[uid];
if ((pUnit->state & 0x01) != TRUE) return 0;
if (order < 0 || order >= pUnit->yccount) return 0;
pYC = &pUnit->ycs[order];
//1-越上限 2-越下限)
if (type == 1)
{
limitValue = pYC->limit1High;
}
else if (type == 2)
{
limitValue = pYC->limit1Low;
}
else if (type == 3)
{
limitValue = pYC->limit2High;
}
else if (type == 4)
{
limitValue = pYC->limit2Low;
}
return limitValue;
}
float CRYDevice::GetUnitYMReal(int uid, int order) float CRYDevice::GetUnitYMReal(int uid, int order)
{ {
int udb; int udb;
@ -444,10 +540,13 @@ BYTE CRYDevice::GetUnitYX(int uid, int point)
return value; return value;
} }
int CRYDevice::GetUnitYXBW(int& uid, BOOLEAN& value, BYTE& qds, int& type, unionCP56Time& st) int CRYDevice::GetUnitYXBW(int& uid, BOOLEAN& value, unionCP56Time& st)
{ {
int order; int order;
int point; int point;
int type;
BYTE qds;
while (yxbw.GetYXBW(m_yxbwload, st, order, value, qds, uid, point, type)) while (yxbw.GetYXBW(m_yxbwload, st, order, value, qds, uid, point, type))
{ {
@ -470,10 +569,11 @@ int CRYDevice::GetUnitSOE(int& uid, BOOLEAN& value, BYTE& qds, unionCP56Time& st
return -1; return -1;
} }
int CRYDevice::GetUnitYCBW(int& uid, LONG& value, BYTE& qds, int& type, unionCP56Time& st) int CRYDevice::GetUnitYCBW(int& uid, LONG& value, int& type, unionCP56Time& st)
{ {
int order; int order;
int point; int point;
BYTE qds;
while (ycbw.GetYCBW(m_ycbwload, st, order, value, qds, uid, point, type)) { while (ycbw.GetYCBW(m_ycbwload, st, order, value, qds, uid, point, type)) {
m_ycbwload++; m_ycbwload++;
@ -751,7 +851,7 @@ void CRYDevice::SetUnitYT(int uid, int order, DWORD value, BYTE act, BYTE result
} }
} }
int CRYDevice::MakeYKFrame(noPollConn* conn, int uid) int CRYDevice::MakeYKFrame(int uid)
{ {
int order; int order;
BYTE value, action, result; BYTE value, action, result;
@ -790,13 +890,13 @@ int CRYDevice::MakeYKFrame(noPollConn* conn, int uid)
jsonRoot["result"] = true; jsonRoot["result"] = true;
} }
publish_sensor_data(conn, m_traceId, "deviceControlResp", jsonRoot); publish_sensor_data(m_traceId, "deviceControlResp", jsonRoot);
return 1; return 1;
} }
return 0; return 0;
} }
int CRYDevice::MakeYTFrame(noPollConn* conn, int uid) int CRYDevice::MakeYTFrame(int uid)
{ {
int order; int order;
BYTE action, result; BYTE action, result;
@ -834,7 +934,7 @@ int CRYDevice::MakeYTFrame(noPollConn* conn, int uid)
jsonRoot["result"] = true; jsonRoot["result"] = true;
} }
publish_sensor_data(conn, m_traceId, "deviceControlResp", jsonRoot); publish_sensor_data(m_traceId, "deviceControlResp", jsonRoot);
return 1; return 1;
} }
@ -1081,13 +1181,13 @@ BOOLEAN CRYDevice::processModbusPointParam(const Json::Value jsonRoot, int uid,
} else { } else {
config_config.units[uid].ycs[point].m_param[0] = 0; config_config.units[uid].ycs[point].m_param[0] = 0;
} }
if (jsonRoot["col3"].isString()) { if (jsonRoot["col2"].isString()) {
BYTE dataType = (BYTE)atoi(jsonRoot["col3"].asCString()); BYTE dataType = (BYTE)atoi(jsonRoot["col2"].asCString());
config_config.units[uid].ycs[point].m_param[4] = dataType; config_config.units[uid].ycs[point].m_param[4] = dataType;
if (dataType == 2 || dataType == 8) config_config.units[uid].ycs[point].m_param[3] = 1; if (dataType == 2 || dataType == 8) config_config.units[uid].ycs[point].m_param[3] = 1;
else config_config.units[uid].ycs[point].m_param[3] = 2; else config_config.units[uid].ycs[point].m_param[3] = 2;
} else if (jsonRoot["col3"].isInt()) { } else if (jsonRoot["col2"].isInt()) {
BYTE dataType = jsonRoot["col3"].asInt(); BYTE dataType = jsonRoot["col2"].asInt();
config_config.units[uid].ycs[point].m_param[4] = dataType; config_config.units[uid].ycs[point].m_param[4] = dataType;
if (dataType == 2 || dataType == 8) config_config.units[uid].ycs[point].m_param[3] = 1; if (dataType == 2 || dataType == 8) config_config.units[uid].ycs[point].m_param[3] = 1;
else config_config.units[uid].ycs[point].m_param[3] = 2; else config_config.units[uid].ycs[point].m_param[3] = 2;
@ -1095,11 +1195,11 @@ BOOLEAN CRYDevice::processModbusPointParam(const Json::Value jsonRoot, int uid,
config_config.units[uid].ycs[point].m_param[4] = 0; config_config.units[uid].ycs[point].m_param[4] = 0;
config_config.units[uid].ycs[point].m_param[3] = 1; config_config.units[uid].ycs[point].m_param[3] = 1;
} }
if (jsonRoot["col2"].isString()) { if (jsonRoot["col3"].isString()) {
BYTE signMark = (BYTE)atoi(jsonRoot["col2"].asCString()); BYTE signMark = (BYTE)atoi(jsonRoot["col3"].asCString());
config_config.units[uid].ycs[point].m_param[5] = signMark; config_config.units[uid].ycs[point].m_param[5] = signMark;
} else if (jsonRoot["col2"].isInt()) { } else if (jsonRoot["col3"].isInt()) {
BYTE signMark = jsonRoot["col2"].asInt(); BYTE signMark = jsonRoot["col3"].asInt();
config_config.units[uid].ycs[point].m_param[5] = signMark; config_config.units[uid].ycs[point].m_param[5] = signMark;
} else { } else {
config_config.units[uid].ycs[point].m_param[5] = 0; config_config.units[uid].ycs[point].m_param[5] = 0;
@ -1693,7 +1793,7 @@ bool CRYDevice::dealConfigFile(const Json::Value jsonRoot)
return true; return true;
} }
bool CRYDevice::OnReceivedSystemAction(noPollConn* conn, const std::string cmdId, const std::string cmd, const Json::Value data) bool CRYDevice::OnReceivedSystemAction(const std::string cmdId, const std::string cmd, const Json::Value data)
{ {
do { do {
if (cmd == "configUpdate") { //配置更新 if (cmd == "configUpdate") { //配置更新
@ -1710,7 +1810,7 @@ bool CRYDevice::OnReceivedSystemAction(noPollConn* conn, const std::string cmdId
return true; return true;
} }
void CRYDevice::on_message(noPollConn* conn, const char *msg, const int size) void CRYDevice::on_message(const char *msg, const int size)
{ {
if (msg == NULL) return; if (msg == NULL) return;
if (size <= 0) return; if (size <= 0) return;
@ -1742,11 +1842,11 @@ void CRYDevice::on_message(noPollConn* conn, const char *msg, const int size)
Json::Int64 mtime = jsonRoot["time"].asInt64(); Json::Int64 mtime = jsonRoot["time"].asInt64();
#endif #endif
Json::Value datas = jsonRoot["data"]; Json::Value datas = jsonRoot["data"];
OnReceivedSystemAction(conn, cmdId, cmd, datas); OnReceivedSystemAction(cmdId, cmd, datas);
} while (0); } while (0);
} }
void CRYDevice::heart_beat(noPollConn* conn, int status) void CRYDevice::heart_beat(int status)
{ {
//发送心跳报文 //发送心跳报文
Json::Value payload; Json::Value payload;
@ -1756,7 +1856,6 @@ void CRYDevice::heart_beat(noPollConn* conn, int status)
if (status == 1) { if (status == 1) {
Json::Value jsonItem; Json::Value jsonItem;
Json::Value jsonValue; Json::Value jsonValue;
//for (int i = 0; i < static_cast<int>(m_gLinkIDs.size()); i++) {
for (int i = 0; i < PROCESSES_NUM - 1; i++) { for (int i = 0; i < PROCESSES_NUM - 1; i++) {
if (config.processes[i].state == TRUE) { if (config.processes[i].state == TRUE) {
char linkId[32]; char linkId[32];
@ -1771,11 +1870,11 @@ void CRYDevice::heart_beat(noPollConn* conn, int status)
} }
} }
publish_sensor_data(conn, "", "heartbeat", payload); publish_sensor_data("", "heartbeat", payload);
} }
bool CRYDevice::publishinitDeviceData(noPollConn* conn, int uid) bool CRYDevice::publishinitDeviceData(int uid)
{ {
if (uid < 0 || uid >= UNIT_NUM) return false; if (uid < 0 || uid >= UNIT_NUM) return false;
@ -1813,12 +1912,12 @@ bool CRYDevice::publishinitDeviceData(noPollConn* conn, int uid)
root["values"] = values; root["values"] = values;
config.units[uid].state |= 0x40; config.units[uid].state |= 0x40;
return publish_sensor_data(conn, "", "initDeviceData", root); return publish_sensor_data("", "initDeviceData", root);
} }
return false; return false;
} }
bool CRYDevice::publishAnalogData(noPollConn* conn, int uid) bool CRYDevice::publishAnalogData(int uid)
{ {
if (uid < 0 || uid >= UNIT_NUM) return false; if (uid < 0 || uid >= UNIT_NUM) return false;
Json::Value root; Json::Value root;
@ -1826,7 +1925,11 @@ bool CRYDevice::publishAnalogData(noPollConn* conn, int uid)
int count = GetUnitYCCount(uid); int count = GetUnitYCCount(uid);
if (count) { if (count) {
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
values[(const char *)config.units[uid].ycs[i].name] = GetUnitYCReal(uid, i); if (GetUnitYCIsFloat(uid, i)) {
values[(const char *)config.units[uid].ycs[i].name] = GetUnitYCReal(uid, i);
} else {
values[(const char *)config.units[uid].ycs[i].name] = GetUnitYC(uid, i);
}
} }
} }
if (values.size()) { if (values.size()) {
@ -1835,12 +1938,12 @@ bool CRYDevice::publishAnalogData(noPollConn* conn, int uid)
root["dataTime"] = datatime; root["dataTime"] = datatime;
root["deviceId"] = static_units[uid].deviceId; root["deviceId"] = static_units[uid].deviceId;
root["values"] = values; root["values"] = values;
return publish_sensor_data(conn, "", "analogData", root); return publish_sensor_data("", "analogData", root);
} }
return false; return false;
} }
bool CRYDevice::publishStateData(noPollConn* conn, int uid) bool CRYDevice::publishStateData(int uid)
{ {
if (uid < 0 || uid >= UNIT_NUM) return false; if (uid < 0 || uid >= UNIT_NUM) return false;
Json::Value root; Json::Value root;
@ -1857,35 +1960,65 @@ bool CRYDevice::publishStateData(noPollConn* conn, int uid)
root["dataTime"] = datatime; root["dataTime"] = datatime;
root["deviceId"] = static_units[uid].deviceId; root["deviceId"] = static_units[uid].deviceId;
root["values"] = values; root["values"] = values;
return publish_sensor_data(conn, "", "stateData", root); return publish_sensor_data("", "stateData", root);
} }
return false; return false;
} }
bool CRYDevice::publishHistoryAnalogData(noPollConn* conn, int uid) bool CRYDevice::publishdeviceEventData(void)
{ {
if (uid < 0 || uid >= UNIT_NUM) return false; int i;
Json::Value root; int uid;
Json::Value values; int yxbw_point;
if (values.size()) { BOOLEAN yxbw_value;
root["deviceId"] = static_units[uid].deviceId; unionCP56Time yxbw_time;
root["values"] = values;
return publish_sensor_data(conn, "", "historyAnalogData", root);
}
return false;
}
bool CRYDevice::publishHistoryStateData(noPollConn* conn, int uid)
{
if (uid < 0 || uid >= UNIT_NUM) return false;
Json::Value root; Json::Value root;
Json::Value values; Json::Value value;
if (values.size()) {
root["deviceId"] = static_units[uid].deviceId; for (i = 0; i < DATABASE_YXBW_NUM; i++)
root["values"] = values; {
return publish_sensor_data(conn, "", "historyStateData", root); yxbw_point = GetUnitYXBW(uid, yxbw_value, yxbw_time);
if (yxbw_point < 0) break;
value["deviceId"] = static_units[uid].deviceId;
value["attrCode"] = (const char *)config.units[uid].yxs[yxbw_point].name;
value["attrValue"] = yxbw_value;
value["eventType"] = 0;
Json::Int64 datatime = (Json::Int64)time(NULL);
datatime *= 1000;
value["dataTime"] = datatime;
value["limitValue"] = Json::Value::null;
root.append(value);
}
int ycbw_point;
int ycbw_type;
LONG ycbw_value;
unionCP56Time ycbw_time;
for (i = 0; i < DATABASE_YCBW_NUM; i++)
{
ycbw_point = GetUnitYCBW(uid, ycbw_value, ycbw_type, ycbw_time);
if (ycbw_point < 0) break;
value["deviceId"] = static_units[uid].deviceId;
value["attrCode"] = (const char *)config.units[uid].ycs[ycbw_point].name;
value["attrValue"] = ycbw_value;
value["eventType"] = ycbw_type;
Json::Int64 datatime = (Json::Int64)time(NULL);
datatime *= 1000;
value["dataTime"] = datatime;
value["limitValue"] = GetUnitYCLimitReal(uid, ycbw_point, ycbw_type);
root.append(value);
}
if (root.size()) {
//return publish_sensor_data("", "deviceEvent", root);
vLog(LOG_DEBUG, "%s", root.toStyledString().c_str());
} }
return false;
return FALSE;
} }
void CRYDevice::releaseAllUnits(void) void CRYDevice::releaseAllUnits(void)
@ -1969,31 +2102,38 @@ bool CRYDevice::ry_run(void)
nopoll_bool isOk = nopoll_conn_is_ready(conn); nopoll_bool isOk = nopoll_conn_is_ready(conn);
if (isOk) { if (isOk) {
last_connect_sec = system32.timers; last_connect_sec = system32.timers;
int msg_count = 0;
noPollMsg *msg[2048];
while ((msg[msg_count] = nopoll_conn_get_msg(conn)) != NULL) { while ((msg[msg_count] = nopoll_conn_get_msg(conn)) != NULL) {
vLog(LOG_DEBUG, "recv length = %d, %d\n", nopoll_msg_get_payload_size(msg[msg_count]), nopoll_msg_is_final(msg[msg_count])); vLog(LOG_DEBUG, "recv %d length = %d, %d\n", msg_count, nopoll_msg_get_payload_size(msg[msg_count]), nopoll_msg_is_final(msg[msg_count]));
char pathN[256];
snprintf(pathN, sizeof(pathN), "0/_%d.txt", msg_count);
FILE* pf = fopen(pathN, "w+");
if (pf) {
fwrite(nopoll_msg_get_payload(msg[msg_count]), nopoll_msg_get_payload_size(msg[msg_count]), 1, pf);
fclose(pf);
}
if (nopoll_msg_is_final(msg[msg_count])) { if (nopoll_msg_is_final(msg[msg_count])) {
msg_count++; msg_count++;
if (msg_count > 0) {
int buffer_len;
BYTE *buffer = NULL;
if (websocket_msg_join(msg, msg_count, buffer, buffer_len)) {
if (buffer) {
on_message((const char *)buffer, buffer_len);
delete [] buffer;
buffer = NULL;
}
for (int i = 0; i < msg_count; i++) {
nopoll_msg_unref(msg[i]);
msg_count = 0;
}
}
}
break; break;
} else { } else {
msg_count++; msg_count++;
} }
} }
if (msg_count > 0) {
int buffer_len;
BYTE *buffer = NULL;
if (websocket_msg_join(msg, msg_count, buffer, buffer_len)) {
if (buffer) {
on_message(conn, (const char *)buffer, buffer_len);
delete [] buffer;
buffer = NULL;
}
}
}
for (int i = 0; i < msg_count; i++) {
nopoll_msg_unref(msg[i]);
}
} else { } else {
if (last_connect_sec > 0 && system32.timers > (last_connect_sec + 30)) { if (last_connect_sec > 0 && system32.timers > (last_connect_sec + 30)) {
nopoll_conn_connect_timeout(ctx, 50000); nopoll_conn_connect_timeout(ctx, 50000);
@ -2015,19 +2155,20 @@ bool CRYDevice::ry_run(void)
} }
if (sec_changed) { if (sec_changed) {
if ((last_sec % 20) == 0) { if ((last_sec % 20) == 0) {
heart_beat(conn, status); heart_beat(status);
} }
} }
publishdeviceEventData();
for (int i = 0; i < UNIT_NUM; i++) { for (int i = 0; i < UNIT_NUM; i++) {
if ((config.units[i].state & 0x01) != TRUE) continue; if ((config.units[i].state & 0x01) != TRUE) continue;
MakeYKFrame(conn, i); MakeYKFrame(i);
MakeYTFrame(conn, i); MakeYTFrame(i);
if (sec_changed) { if (sec_changed) {
//publishinitDeviceData(conn, i); //publishinitDeviceData(i);
if ((last_sec % 60) == 0) { //更新数据 // if ((last_sec % 10) == 0) { //更新数据
publishAnalogData(conn, i); publishAnalogData(i);
publishStateData(conn, i); publishStateData(i);
} // }
} }
} }
return m_dataAcquisitionReload; return m_dataAcquisitionReload;

View File

@ -80,6 +80,9 @@ private:
DWORD last_connect_sec = 0; DWORD last_connect_sec = 0;
int status; int status;
int msg_count = 0;
noPollMsg *msg[2048];
bool m_dataAcquisitionReload = false; bool m_dataAcquisitionReload = false;
char m_host[256] = {"127.0.0.1"}; char m_host[256] = {"127.0.0.1"};
@ -105,37 +108,43 @@ private:
int GetUnitYXCount(int uid); int GetUnitYXCount(int uid);
int GetUnitYCCount(int uid); int GetUnitYCCount(int uid);
int GetUnitYMCount(int uid); int GetUnitYMCount(int uid);
float GetUnitYCReal(int uid, int order); LONG GetUnitYC(int uid, int order) const;
float GetUnitYCRealFromValue(int uid, int order, long value); float GetUnitYCReal(int uid, int order) const;
float GetUnitYCRealFromValue(int uid, int order, long value) const;
BOOLEAN GetUnitYCIsFloat(int uid, int order) const;
float GetUnitYCLimitReal(int uid, int order, int type = 1) const;
float GetUnitYMReal(int uid, int order); float GetUnitYMReal(int uid, int order);
BYTE GetUnitYX(int uid, int point); BYTE GetUnitYX(int uid, int point);
int GetUnitYXBW(int& uid, BOOLEAN& value, BYTE& qds, int& type, unionCP56Time& st); int GetUnitYXBW(int& uid, BOOLEAN& value, unionCP56Time& st);
int GetUnitSOE(int& uid, BOOLEAN& value, BYTE& qds, unionCP56Time& st); int GetUnitSOE(int& uid, BOOLEAN& value, BYTE& qds, unionCP56Time& st);
int GetUnitYCBW(int& uid, LONG& value, BYTE& qds, int& type, unionCP56Time& st); int GetUnitYCBW(int& uid, LONG& value, int& type, unionCP56Time& st);
BOOLEAN GetUnitYK(int uid, int& order, BYTE& value, BYTE& act, BYTE& result); BOOLEAN GetUnitYK(int uid, int& order, BYTE& value, BYTE& act, BYTE& result);
void SetUnitYK(int uid, int order, BYTE value, BYTE act, BYTE result); void SetUnitYK(int uid, int order, BYTE value, BYTE act, BYTE result);
BOOLEAN GetUnitYT(int uid, int& order, DWORD& value, BYTE& act, BYTE& result); BOOLEAN GetUnitYT(int uid, int& order, DWORD& value, BYTE& act, BYTE& result);
void SetUnitYT(int uid, int order, DWORD value, BYTE act, BYTE result); void SetUnitYT(int uid, int order, DWORD value, BYTE act, BYTE result);
int MakeYKFrame(noPollConn* conn, int uid); int MakeYKFrame(int uid);
int MakeYTFrame(noPollConn* conn, int uid); int MakeYTFrame(int uid);
bool OnReceivedDeviceCommand(const Json::Value jsonRoot); bool OnReceivedDeviceCommand(const Json::Value jsonRoot);
BOOLEAN processUartParam(const Json::Value jsonRoot, int ord); BOOLEAN processUartParam(const Json::Value jsonRoot, int ord);
BOOLEAN processNetworkParam(const Json::Value jsonRoot, int pid); BOOLEAN processNetworkParam(const Json::Value jsonRoot, int pid);
BOOLEAN processHostIEC104ProcessParam(const Json::Value jsonRoot, int pid); BOOLEAN processHostIEC104ProcessParam(const Json::Value jsonRoot, int pid);
BOOLEAN processModbusPointParam(const Json::Value jsonRoot, int uid, int point, int type); BOOLEAN processModbusPointParam(const Json::Value jsonRoot, int uid, int point, int type);
bool dealConfigFile(const Json::Value jsonRoot); bool dealConfigFile(const Json::Value jsonRoot);
bool OnReceivedSystemAction(noPollConn* conn, const std::string cmdId, const std::string cmd, const Json::Value data); bool OnReceivedSystemAction(const std::string cmdId, const std::string cmd, const Json::Value data);
void on_message(noPollConn* conn, const char *msg, const int size); void on_message(const char *msg, const int size);
void heart_beat(noPollConn* conn, int status); void heart_beat(int status);
bool publishinitDeviceData(noPollConn* conn, int uid); bool publishinitDeviceData(int uid);
bool publishAnalogData(noPollConn* conn, int uid); bool publishAnalogData(int uid);
bool publishStateData(noPollConn* conn, int uid); bool publishStateData(int uid);
bool publishHistoryAnalogData(noPollConn* conn, int uid); bool publishHistoryAnalogData(int uid);
bool publishHistoryStateData(noPollConn* conn, int uid); bool publishHistoryStateData(int uid);
bool publishdeviceEventData(void);
BOOLEAN publishYXBWData(int uid);
BOOLEAN publishYCBWData(int uid);
BOOLEAN websocket_msg_join(noPollMsg **msg, int msg_count, BYTE* &buffer, int &buffer_size); BOOLEAN websocket_msg_join(noPollMsg **msg, int msg_count, BYTE* &buffer, int &buffer_size);
int websocket_write(noPollConn* conn, const char * buffer, int buffer_len); int websocket_write(const char * buffer, int buffer_len);
bool publish_sensor_data(noPollConn* conn, const std::string traceId, const char* command, const Json::Value payload); bool publish_sensor_data(const std::string traceId, const char* command, const Json::Value payload);
}; };
#endif //_RY_H_ #endif //_RY_H_

View File

@ -879,8 +879,6 @@ float CProcess::GetUnitYCRealFromValue(int uid, int order, long value) const
base = 0.0f; base = 0.0f;
} }
else { else {
// coef = database.ycs[udb].coef;
// base = database.ycs[udb].base;
coef = pYC->coef; coef = pYC->coef;
base = pYC->base; base = pYC->base;
} }
@ -906,7 +904,6 @@ float CProcess::GetUnitYCCoef(int uid, int order) const
} }
else else
{ {
// coef = database.ycs[udb].coef;
coef = pYC->coef; coef = pYC->coef;
} }
@ -933,7 +930,6 @@ float CProcess::GetUnitYCBase(int uid, int order) const
} }
else else
{ {
// base = database.ycs[udb].base;
base = pYC->base; base = pYC->base;
} }
@ -1022,7 +1018,6 @@ float CProcess::GetUnitYMCoef(int uid, int order) const
} }
else else
{ {
// coef = database.yms[udb].coef;
coef = pYM->coef; coef = pYM->coef;
} }
@ -1049,7 +1044,6 @@ float CProcess::GetUnitYMBase(int uid, int order) const
} }
else else
{ {
// base = database.yms[udb].base;
base = pYM->base; base = pYM->base;
} }

View File

@ -3,11 +3,7 @@
#include <math.h> #include <math.h>
#include <map> #include <map>
#include <unordered_map> #include <unordered_map>
///////////////////////////////////////////////////////////////////////////////////
//Valid slave device addresses are in the range of 0 锟?C 247 decimal. //
//The individual slave devices are assigned addresses in the range of 1 锟?C 247. //
//Address 0 is used for the broadcast address, which all slave devices recognize.//
///////////////////////////////////////////////////////////////////////////////////
#ifdef HAVE_FTP_PROCESS #ifdef HAVE_FTP_PROCESS
#define MODBUSP_READ_ID 100 //读取文件及文件夹ID #define MODBUSP_READ_ID 100 //读取文件及文件夹ID
@ -43,9 +39,9 @@ struct {
{ 2, 205 }, { 2, 205 },
{ 2, 206 }, { 2, 206 },
{ 2, 207 }, { 2, 207 },
{ 2, 208 },
{ 2, 209 }, { 2, 209 },
{ 2, 210 }, { 2, 210 },
{ 2, 208 },
{ 2, 211 }, { 2, 211 },
{ 2, 212 }, { 2, 212 },
{ 2, 213 }, { 2, 213 },
@ -183,7 +179,14 @@ struct {
{ 2, 358 }, { 2, 358 },
{ 2, 359 }, { 2, 359 },
{ 2, 360 }, { 2, 360 },
{ 2, 361 } { 2, 361 },
{ 2, 362 },
{ 2, 363 },
{ 2, 364 },
{ 2, 365 },
{ 2, 366 },
{ 2, 367 },
{ 2, 368 }
}; };
#include <curl/curl.h> #include <curl/curl.h>
@ -218,7 +221,7 @@ static bool publish_sensor_data(const noPollConn* conn, const char* command, con
std::string outputConfig = Json::writeString(builder, jsonRoot); std::string outputConfig = Json::writeString(builder, jsonRoot);
int rc = websocket_write(conn, outputConfig.c_str(), outputConfig.length()); int rc = websocket_write(conn, outputConfig.c_str(), outputConfig.length());
vLog(LOG_DEBUG, "send cmd: %s, payload: %d\n%s\n", command, outputConfig.length(), outputConfig.c_str()); //vLog(LOG_DEBUG, "send cmd: %s, payload: %d\n", command, outputConfig.length()/*, outputConfig.c_str()*/);
if (rc != 0) { if (rc != 0) {
vLog(LOG_DEBUG, "websocket write is error<%d>,insert into database.\n", rc); vLog(LOG_DEBUG, "websocket write is error<%d>,insert into database.\n", rc);
//插入数据库 //插入数据库
@ -490,7 +493,7 @@ static size_t writefunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
static int ftpget(const char* remote, const char* local, const char* user, const char* pwd, const long timeout = 3, struct memory* chunk = NULL) static int ftpget(const char* remote, const char* local, const char* user, const char* pwd, const long timeout = 3, struct memory* chunk = NULL)
{ {
vLog(LOG_DEBUG, "start to get %s to local %s, with name: %s, and password: %s.\n", remote, local, user, pwd); //vLog(LOG_DEBUG, "start to get %s to local %s, with name: %s, and password: %s.\n", remote, local, user, pwd);
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
CURL* curl = curl_easy_init(); CURL* curl = curl_easy_init();
@ -536,17 +539,18 @@ static int ftpget(const char* remote, const char* local, const char* user, const
ret = curl_easy_perform(curl); ret = curl_easy_perform(curl);
#endif #endif
//vLog(LOG_DEBUG, "curl easy perform return value is: %d, and OK is: %d.\n", ret, CURLE_OK); //vLog(LOG_DEBUG, "curl easy perform return value is: %d, and OK is: %d.\n", ret, CURLE_OK);
#if 0
int curl_state = 0; int curl_state = 0;
if (ret == CURLE_OK) curl_state = 1; if (ret == CURLE_OK) curl_state = 1;
else { else {
vLog(LOG_ERROR, "%d,%s\n", ret, curl_easy_strerror(ret)); //vLog(LOG_ERROR, "%d,%s\n", ret, curl_easy_strerror(ret));
curl_state = 0; curl_state = 0;
} }
#endif
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
curl_global_cleanup(); curl_global_cleanup();
return curl_state; return ret;
} }
static void* ryftp_process(void* param) static void* ryftp_process(void* param)
@ -583,9 +587,10 @@ static void* ryftp_process(void* param)
DWORD target_addr = mbt->target_addr; DWORD target_addr = mbt->target_addr;
memset(ipaddress, '\0', sizeof(ipaddress)); memset(ipaddress, '\0', sizeof(ipaddress));
inet_ntop(AF_INET, &target_addr, ipaddress, 16); inet_ntop(AF_INET, &target_addr, ipaddress, 16);
#if 0
struct timespec start, end; struct timespec start, end;
double elapsed_time = 0; double elapsed_time = 0;
#endif
for (int i = 0; i < sizeof(m_datalen_mbaddr) / sizeof(m_datalen_mbaddr[0]); i++) { for (int i = 0; i < sizeof(m_datalen_mbaddr) / sizeof(m_datalen_mbaddr[0]); i++) {
m_datalen2mbaddr_map.insert(datalen2mbaddrmap::value_type(m_datalen_mbaddr[i].address, i + 1)); m_datalen2mbaddr_map.insert(datalen2mbaddrmap::value_type(m_datalen_mbaddr[i].address, i + 1));
@ -621,17 +626,17 @@ static void* ryftp_process(void* param)
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iYPLevel) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iYPLevel) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iYPLevel); fields[len].length = sizeof(t_data.iYPLevel);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenSpeed1s) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iWindSpeed_1sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenSpeed1s); fields[len].length = sizeof(t_data.iWindSpeed_1sec);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenPower1s) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenSpeed_1sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenPower1s); fields[len].length = sizeof(t_data.iGenSpeed_1sec);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iWindSpeed1s) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenPower_1sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iWindSpeed1s); fields[len].length = sizeof(t_data.iGenPower_1sec);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenToruqe1s) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenToruqe_1sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenToruqe1s); fields[len].length = sizeof(t_data.iGenToruqe_1sec);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iRotorSpeed) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iRotorSpeed) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iRotorSpeed); fields[len].length = sizeof(t_data.iRotorSpeed);
@ -1044,6 +1049,27 @@ static void* ryftp_process(void* param)
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.SCW042) - reinterpret_cast<uintptr_t>(&t_data); fields[len].start = reinterpret_cast<uintptr_t>(&t_data.SCW042) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.SCW042); fields[len].length = sizeof(t_data.SCW042);
len++; len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenSpeed_10sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenSpeed_10sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenSpeed_30sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenSpeed_30sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenPower_10sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenPower_10sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iGenPower_30sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iGenPower_30sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iWindSpeed_10sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iWindSpeed_10sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iWindSpeed_30sec) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iWindSpeed_30sec);
len++;
fields[len].start = reinterpret_cast<uintptr_t>(&t_data.iAvailablePower) - reinterpret_cast<uintptr_t>(&t_data);
fields[len].length = sizeof(t_data.iAvailablePower);
len++;
//判断是否链接单元 //判断是否链接单元
@ -1085,7 +1111,7 @@ static void* ryftp_process(void* param)
} }
//根据实际配置表将 //根据实际配置表将
WORD ftpget_retry_count = 0;
while (TRUE) { while (TRUE) {
sleep(1); //每秒执行一次 sleep(1); //每秒执行一次
//ftp获取文件 //ftp获取文件
@ -1096,11 +1122,15 @@ static void* ryftp_process(void* param)
snprintf(name, sizeof(name), "%s/%d", pathName, mbt->m_currentFileNo); snprintf(name, sizeof(name), "%s/%d", pathName, mbt->m_currentFileNo);
snprintf(remote, sizeof(remote), "ftp://%s/Hard%20Disk2/data/rtdatalog/%d/%d", ipaddress, mbt->m_currentDirNo, mbt->m_currentFileNo); snprintf(remote, sizeof(remote), "ftp://%s/Hard%20Disk2/data/rtdatalog/%d/%d", ipaddress, mbt->m_currentDirNo, mbt->m_currentFileNo);
#if 0
clock_gettime(CLOCK_MONOTONIC, &start); clock_gettime(CLOCK_MONOTONIC, &start);
#endif
struct memory chunk = {0}; // For storing the downloaded data struct memory chunk = {0}; // For storing the downloaded data
if (ftpget(remote, name, user, password, 3, &chunk)) { int result = ftpget(remote, name, user, password, 3, &chunk);
if (result == CURLE_OK) {
//成功,处理文件 //成功,处理文件
vLog(LOG_DEBUG, "get %s to local %s, with name: %s, and password: %s okay.\n", remote, name, user, password);
ftpget_retry_count = 0;
struRYDeviceData *data = (struRYDeviceData *)chunk.response; struRYDeviceData *data = (struRYDeviceData *)chunk.response;
unionCP56Time st; unionCP56Time st;
int uid = mbt->GetCurUnitID(); int uid = mbt->GetCurUnitID();
@ -1173,11 +1203,11 @@ static void* ryftp_process(void* param)
} }
} }
if (chunk.response) free(chunk.response); if (chunk.response) free(chunk.response);
//vLog(LOG_DEBUG, "get a file, then send to ws.\n"); #if 0
clock_gettime(CLOCK_MONOTONIC, &end); clock_gettime(CLOCK_MONOTONIC, &end);
elapsed_time = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9; elapsed_time = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;
vLog(LOG_DEBUG, "Elapsed time: %.6f seconds\n", elapsed_time); vLog(LOG_DEBUG, "Elapsed time: %.6f seconds\n", elapsed_time);
#endif
mbt->m_lastFileNo = mbt->m_currentFileNo; mbt->m_lastFileNo = mbt->m_currentFileNo;
mbt->m_currentFileNo++; mbt->m_currentFileNo++;
if ((mbt->m_currentFileNo - mbt->m_lastStartFileNo) % 1000 == 0) { if ((mbt->m_currentFileNo - mbt->m_lastStartFileNo) % 1000 == 0) {
@ -1191,6 +1221,15 @@ static void* ryftp_process(void* param)
#endif #endif
//保存文件信息 //保存文件信息
} }
} else if (result == CURLE_REMOTE_FILE_NOT_FOUND) {
//文件不存在尝试60次1分钟正常情况下PLC10s生成一个文件
ftpget_retry_count++;
if (ftpget_retry_count >= 60) {
//重新通过modbus程序获取文件夹和最新文件信息
mbt->m_iv = 0;
mbt->m_currentDirNo = -1;
mbt->m_currentFileNo = -1;
}
} }
} }
@ -1642,9 +1681,8 @@ BOOLEAN CHostModbusTcpProcess::OnPreCreate(int id)
m_nTimeout = 200; m_nTimeout = 200;
calc2(); calc2();
vLog(LOG_DEBUG, "file size is: %d\n", sizeof(struRYDeviceData) * 250 / 1024);
#ifdef HAVE_FTP_PROCESS #ifdef HAVE_FTP_PROCESS
vLog(LOG_DEBUG, "file size is: %d\n", sizeof(struRYDeviceData) * 250 / 1024);
//启动后创建ftp线程 //启动后创建ftp线程
if (m_pid <= 0) { if (m_pid <= 0) {
vLog(LOG_DEBUG, "create a ftp thread.\n"); vLog(LOG_DEBUG, "create a ftp thread.\n");
@ -2271,12 +2309,7 @@ BOOLEAN CHostModbusTcpProcess::OnReceiveIDData(CHostModbusTcpProcessItem *pItem,
//当前文件夹下第一个文件 //当前文件夹下第一个文件
m_lastStartFileNo = (DWORD)((pBuf[2] << 24) | (pBuf[3] << 16) | (pBuf[0] << 8) | pBuf[1]); pBuf += 4; m_lastStartFileNo = (DWORD)((pBuf[2] << 24) | (pBuf[3] << 16) | (pBuf[0] << 8) | pBuf[1]); pBuf += 4;
#if 0 vLog(LOG_DEBUG, "最新文件夹编号: %ld, 最新文件名编号: %ld: 最新文件夹中第一个文件的编号: %ld\n", m_currentDirNo, m_currentFileNo, m_lastStartFileNo);
m_currentDirNo = 37;
m_currentFileNo = 26901;
m_lastStartFileNo = 26901;
#endif
vLog(LOG_DEBUG, "dir: %ld, file: %ld: start: %ld\n", m_currentDirNo, m_currentFileNo, m_lastStartFileNo);
return TRUE; return TRUE;
} }
@ -2392,6 +2425,7 @@ BOOLEAN CHostModbusTcpProcess::OnReceiveYCData(CHostModbusTcpProcessItem *pItem,
reg_count = pParam[3]; reg_count = pParam[3];
value_type = pParam[4]; value_type = pParam[4];
sign_mark = pParam[5]; sign_mark = pParam[5];
//vLog(LOG_DEBUG, "here count is: %d, value type is: %d, and ", reg_count, value_type);
if ((1 == reg_count) && (2 == value_type)) if ((1 == reg_count) && (2 == value_type))
{ //16位归一化值 { //16位归一化值
if (2 == value_type) if (2 == value_type)
@ -2399,6 +2433,7 @@ BOOLEAN CHostModbusTcpProcess::OnReceiveYCData(CHostModbusTcpProcessItem *pItem,
if (sign_mark == 0) nValue = (DWORD)(WORD)((pBuf[0] << 8) | pBuf[1]); if (sign_mark == 0) nValue = (DWORD)(WORD)((pBuf[0] << 8) | pBuf[1]);
else nValue = (DWORD)(short)((pBuf[0] << 8) | pBuf[1]); else nValue = (DWORD)(short)((pBuf[0] << 8) | pBuf[1]);
SetUnitYC(uid, point, (LONG)nValue); SetUnitYC(uid, point, (LONG)nValue);
//vLog(LOG_DEBUG, "value is: %ld.\n", nValue);
} }
else if (8 == value_type) else if (8 == value_type)
{ {
@ -2429,6 +2464,7 @@ BOOLEAN CHostModbusTcpProcess::OnReceiveYCData(CHostModbusTcpProcessItem *pItem,
{ //归一化值,高位在第一个寄存器 { //归一化值,高位在第一个寄存器
nValue = (DWORD)(pBuf[0] << 24 | pBuf[1] << 16 | pBuf[2] << 8 | pBuf[3]); nValue = (DWORD)(pBuf[0] << 24 | pBuf[1] << 16 | pBuf[2] << 8 | pBuf[3]);
SetUnitYC(uid, point, (LONG)nValue); SetUnitYC(uid, point, (LONG)nValue);
//vLog(LOG_DEBUG, "value is: %ld.\n", nValue);
} }
else if (4 == value_type) else if (4 == value_type)
{ //归一化值,高位在第二个寄存器 { //归一化值,高位在第二个寄存器

View File

@ -4,7 +4,7 @@
#include "netproc.h" #include "netproc.h"
#include "modbus_def.h" #include "modbus_def.h"
#define HAVE_FTP_PROCESS //#define HAVE_FTP_PROCESS
#ifdef HAVE_FTP_PROCESS #ifdef HAVE_FTP_PROCESS
#include <dirent.h> #include <dirent.h>
#include <nopoll.h> #include <nopoll.h>
@ -21,10 +21,10 @@ typedef struct {
WORD iTurbineOperationMode;// 运行模式 2 205 1 需要解析 1s 控制系统 WORD iTurbineOperationMode;// 运行模式 2 205 1 需要解析 1s 控制系统
WORD iBPLevel;// 刹车等级 2 206 1 需要解析 1s 控制系统 WORD iBPLevel;// 刹车等级 2 206 1 需要解析 1s 控制系统
WORD iYPLevel;// 偏航运行模式 2 207 1 需要解析 1s 控制系统 WORD iYPLevel;// 偏航运行模式 2 207 1 需要解析 1s 控制系统
WORD iGenSpeed1s;// 发电机转速1秒均值 2 209 0.1 转/分 1s 控制系统 WORD iWindSpeed_1sec;// 风速1秒均值 2 208 0.01 米/秒 1s 控制系统
WORD iGenPower1s;// 机组有功1秒均值 2 210 0.1 千瓦 1s 控制系统 WORD iGenSpeed_1sec;// 发电机转速1秒均值 2 209 0.1 转/分 1s 控制系统
WORD iWindSpeed1s;// 风速1秒均值 2 208 0.01 米/秒 1s 控制系统 WORD iGenPower_1sec;// 机组有功1秒均值 2 210 0.1 千瓦 1s 控制系统
WORD iGenToruqe1s;// 发电机扭矩1秒均值 2 211 0.1 牛米 1s 控制系统 WORD iGenToruqe_1sec;// 发电机扭矩1秒均值 2 211 0.1 牛米 1s 控制系统
WORD iRotorSpeed;// 风轮转速 2 212 0.1 转/分 1s 控制系统 WORD iRotorSpeed;// 风轮转速 2 212 0.1 转/分 1s 控制系统
WORD iTheoreticalPower;// 理论有功功率 2 213 0.1 千瓦 1s 控制系统 WORD iTheoreticalPower;// 理论有功功率 2 213 0.1 千瓦 1s 控制系统
WORD iReactivePower;// 无功功率 2 214 0.1 千乏 1s 控制系统 WORD iReactivePower;// 无功功率 2 214 0.1 千乏 1s 控制系统
@ -161,7 +161,14 @@ typedef struct {
WORD SCW039;// 故障代码字39 2 358 1 1s 控制系统 WORD SCW039;// 故障代码字39 2 358 1 1s 控制系统
WORD SCW040;// 故障代码字40 2 359 1 1s 控制系统 WORD SCW040;// 故障代码字40 2 359 1 1s 控制系统
WORD SCW041;// 故障代码字41 2 360 1 1s 控制系统 WORD SCW041;// 故障代码字41 2 360 1 1s 控制系统
WORD SCW042;// 故障代码字42 2 361 1 1s 控制系统 WORD SCW042;// 故障代码字42 2 361 1 1s 控制系统
WORD iGenSpeed_10sec;// 发电机转速10秒均值 2 362
WORD iGenSpeed_30sec;// 发电机转速30秒均值 2 363
WORD iGenPower_10sec;// 机组有功10秒均值 2 364
WORD iGenPower_30sec;// 机组有功30秒均值 2 365
WORD iWindSpeed_10sec;// 风速10秒均值 2 366
WORD iWindSpeed_30sec;// 风速30秒均值 2 367
WORD iAvailablePower;// 可用有功功率 2 368
} struRYDeviceData; } struRYDeviceData;
#pragma pack() #pragma pack()

View File

@ -402,20 +402,52 @@ public:
} }
} else if (database.ycs[udb].value != value) { //update value } else if (database.ycs[udb].value != value) { //update value
//此处增加越线判断 //此处增加越线判断
float coef = pUnit->ycs[point].coef;
float base = pUnit->ycs[point].base;
float fValue = (float)((float)value * coef + base);
if (pUnit->ycs[point].limit1Enable) { if (pUnit->ycs[point].limit1Enable) {
if (fValue > pUnit->ycs[point].limit1High) { //越上限
} if (!pUnit->ycs[point].ycbw) {
if (pUnit->ycs[point].limit2Enable) { pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, 1);
}
} else if (fValue < pUnit->ycs[point].limit1Low) { //越下限
if (!pUnit->ycs[point].ycbw) {
pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, 2);
}
} else { //不越限
if (pUnit->ycs[point].ycbw) {
pUnit->ycs[point].ycbw = FALSE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, 5);
}
}
//默认二级越限必须大于一级越限
if (pUnit->ycs[point].limit2Enable) {
if (fValue > pUnit->ycs[point].limit2High) { //越上限
if (!pUnit->ycs[point].ycbw) {
pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, 3);
}
} else if (fValue < pUnit->ycs[point].limit2Low) { //越下限
if (!pUnit->ycs[point].ycbw) {
pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, 4);
}
}
}
} }
pUnit->ycs[point].value = value; pUnit->ycs[point].value = value;
pUnit->ycs[point].update_time = system32.timers; pUnit->ycs[point].update_time = system32.timers;
#if 0
if (pUnit->ycs[point].change_pos >= 0 && bAddYCBW) { if (pUnit->ycs[point].change_pos >= 0 && bAddYCBW) {
if (abs(pUnit->ycs[point].value - database.ycs[udb].value) >= pUnit->ycs[point].change_pos) { //40码值变化量认为是遥测变位 if (abs(pUnit->ycs[point].value - database.ycs[udb].value) >= pUnit->ycs[point].change_pos) { //40码值变化量认为是遥测变位
pUnit->ycs[point].ycbw = TRUE; pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, YCBWT_AUTO); ycbw.PushYCBW(system32.now, udb, value, qds, uid, point, YCBWT_AUTO);
} }
} }
#endif
database.ycs[udb].value = value; database.ycs[udb].value = value;
database.ycs[udb].op_unit = uid; database.ycs[udb].op_unit = uid;
database.ycs[udb].update_time = system32.timers; //设置刷新时间 database.ycs[udb].update_time = system32.timers; //设置刷新时间
@ -458,12 +490,14 @@ public:
} }
pUnit->ycs[point].value = nvalue; pUnit->ycs[point].value = nvalue;
pUnit->ycs[point].update_time = system32.timers; pUnit->ycs[point].update_time = system32.timers;
#if 0
if (pUnit->ycs[point].change_pos >= 0 && bAddYCBW) { if (pUnit->ycs[point].change_pos >= 0 && bAddYCBW) {
if (abs(pUnit->ycs[point].value - database.ycs[udb].value) >= pUnit->ycs[point].change_pos) { //40码值变化量认为是遥测变位 if (abs(pUnit->ycs[point].value - database.ycs[udb].value) >= pUnit->ycs[point].change_pos) { //40码值变化量认为是遥测变位
pUnit->ycs[point].ycbw = TRUE; pUnit->ycs[point].ycbw = TRUE;
ycbw.PushYCBW(system32.now, udb, nvalue, qds, uid, point, YCBWT_AUTO); ycbw.PushYCBW(system32.now, udb, nvalue, qds, uid, point, YCBWT_AUTO);
} }
} }
#endif
database.ycs[udb].value = nvalue; database.ycs[udb].value = nvalue;
database.ycs[udb].op_unit = uid; database.ycs[udb].op_unit = uid;
database.ycs[udb].update_time = system32.timers; //设置刷新时间 database.ycs[udb].update_time = system32.timers; //设置刷新时间

View File

@ -75,7 +75,7 @@ typedef int SOCKET;
#define MAX_DISPLAY_BUFFER_SIZE 0x8000 #define MAX_DISPLAY_BUFFER_SIZE 0x8000
#define HARDWARE_PORTS_NUM 20 #define HARDWARE_PORTS_NUM 20
#define PROCESSES_NUM 64 #define PROCESSES_NUM 256
#define PROCESS_UNIT_NUM 256 #define PROCESS_UNIT_NUM 256
#define UNIT_NUM 256 #define UNIT_NUM 256
#define UNIT_YX_MAX 0x1500 #define UNIT_YX_MAX 0x1500