123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- #include "mbs.h"
- #include "appl.h"
- enum mbs_idx_t {
- MBSIDX_CTN = 0,
- };
- // 0:cess2000 modbus tcp slave
- fmodbus_t *MB[8];
- /* ----------------------- Defines ------------------------------------------*/
- /* ctn modbus tcp slave*/
- #define REG_HOLDING_START_ZH 0x0000
- #define REG_HOLDING_NREGS_ZH 0x8000
- static USHORT usRegHoldingBuf_ZH[REG_HOLDING_NREGS_ZH] = {0};
- #define REG_INPUT_START_ZH 0x0000
- #define REG_INPUT_REG_ZH 0x8000
- static USHORT usRegInputReg_ZH[REG_INPUT_REG_ZH] = {0};
- static enum ThreadState { STOPPED, RUNNING, SHUTDOWN } ePollThreadState;
- static pthread_mutex_t xLock = PTHREAD_MUTEX_INITIALIZER;
- // static BOOL bDoExit;
- void *pvPollingThread(void *pvParameter) {
- fmodbus_t *ctx = (fmodbus_t *) pvParameter;
- syslog(LOG_INFO, "%s, ++, mbsidx:%d", __func__, ctx->mbsidx);
- if (eMBEnable(ctx) == MB_ENOERR) {
- do {
- if (eMBPoll(ctx) != MB_ENOERR) break;
- } while (TRUE);
- }
- (void) eMBDisable(ctx);
- syslog(LOG_INFO, "%s, --, mbsidx:%d", __func__, ctx->mbsidx);
- return NULL;
- }
- static void onReadInputBuf_ZH(fmodbus_t *ctx) {
- usRegInputReg_ZH[1 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Tick);
- usRegInputReg_ZH[2 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.State);
- usRegInputReg_ZH[3 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.Err);
- usRegInputReg_ZH[4 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.Ap);
- usRegInputReg_ZH[5 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.Soc);
- usRegInputReg_ZH[6 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.Soh);
- usRegInputReg_ZH[9 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.GateAp);
- usRegInputReg_ZH[10 - REG_INPUT_START_ZH] =
- (unsigned short) (0); // 这个版本的 ctn2 没有光伏功率
- usRegInputReg_ZH[11 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Ctl.GateLoadAp);
- usRegInputReg_ZH[12 - REG_INPUT_START_ZH] = (unsigned short) (1);
- usRegInputReg_ZH[14 - REG_INPUT_START_ZH] = APPL.GateMeter.CommState;
- usRegInputReg_ZH[70 - REG_INPUT_START_ZH] = 0;
- usRegInputReg_ZH[71 - REG_INPUT_START_ZH] = (233 & 0xffff0000) >> 16;
- usRegInputReg_ZH[72 - REG_INPUT_START_ZH] = (233 & 0x0000ffff);
- usRegInputReg_ZH[73 - REG_INPUT_START_ZH] = (100 & 0xffff0000) >> 16;
- usRegInputReg_ZH[74 - REG_INPUT_START_ZH] = (100 & 0x0000ffff);
- usRegInputReg_ZH[250 - REG_INPUT_START_ZH] = (unsigned short) (1); // ctn idx 始终为1,只有一台柜子
- usRegInputReg_ZH[251 - REG_INPUT_START_ZH] = (unsigned short) (APPL.CommState);
- usRegInputReg_ZH[252 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Tick);
- usRegInputReg_ZH[253 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Ctl.State);
- usRegInputReg_ZH[254 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.Err);
- usRegInputReg_ZH[255 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.Ap);
- usRegInputReg_ZH[256 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.Soc);
- usRegInputReg_ZH[257 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.Soh);
- usRegInputReg_ZH[258 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Ctl.bChgAble);
- usRegInputReg_ZH[259 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Ctl.bDhgAble);
- usRegInputReg_ZH[260 - REG_INPUT_START_ZH] =
- (int) (APPL.Enjoy100kW.Aps); // 有功功率设定值
- usRegInputReg_ZH[261 - REG_INPUT_START_ZH] = (unsigned short) (APPL.Ctl.Cmd);
- usRegInputReg_ZH[271 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.CommState);
- usRegInputReg_ZH[272 - REG_INPUT_START_ZH] =
- (int) (APPL.Enjoy100kW.Ap);
- usRegInputReg_ZH[273 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Tigbt);
- usRegInputReg_ZH[276 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Uab);
- usRegInputReg_ZH[277 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Ubc);
- usRegInputReg_ZH[278 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Uca);
- usRegInputReg_ZH[279 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Ia);
- usRegInputReg_ZH[280 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Ib);
- usRegInputReg_ZH[281 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Enjoy100kW.Ic);
- usRegInputReg_ZH[282 - REG_INPUT_START_ZH] =
- (int) (APPL.Enjoy100kW.TotalBusVolt);
- usRegInputReg_ZH[283 - REG_INPUT_START_ZH] =
- (int) (APPL.Enjoy100kW.TotalBusCurr);
- usRegInputReg_ZH[301 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.CommState);
- usRegInputReg_ZH[302 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.HvState);
- usRegInputReg_ZH[303 - REG_INPUT_START_ZH] =
- (int) (APPL.GaoteBms.BatV);
- usRegInputReg_ZH[304 - REG_INPUT_START_ZH] = (int) (APPL.GaoteBms.BatI);
- usRegInputReg_ZH[307 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.MaxCellV * 1000);
- usRegInputReg_ZH[308 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.AvgCellV * 1000);
- usRegInputReg_ZH[309 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.GaoteBms.MinCellV * 1000);
- usRegInputReg_ZH[310 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.MaxCellT;
- usRegInputReg_ZH[311 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.AvgCellT;
- usRegInputReg_ZH[312 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.MinCellT;
- usRegInputReg_ZH[315 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.CellVDiff;
- usRegInputReg_ZH[316 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.CellTDiff;
- usRegInputReg_ZH[317 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.ISORes;
- usRegInputReg_ZH[318 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.GaoteBms.NegRes;
- usRegInputReg_ZH[351 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.Envicool5kW.CommState;
- usRegInputReg_ZH[352 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Envicool5kW.OutWaterTemp * 10);
- usRegInputReg_ZH[353 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Envicool5kW.InWaterTemp * 10);
- usRegInputReg_ZH[354 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Envicool5kW.OutWaterPre * 10);
- usRegInputReg_ZH[355 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Envicool5kW.InWaterPre * 10);
- usRegInputReg_ZH[356 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Envicool5kW.EnvTemp * 10);
- usRegInputReg_ZH[371 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.Adl200.CommState;
- usRegInputReg_ZH[372 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.Adl200.PosAe;
- usRegInputReg_ZH[373 - REG_INPUT_START_ZH] =
- (unsigned short) APPL.Adl200.NegAe;
- usRegInputReg_ZH[374 - REG_INPUT_START_ZH] = (unsigned short) 0;
- usRegInputReg_ZH[375 - REG_INPUT_START_ZH] = (int) APPL.Adl200.Ap;
- usRegInputReg_ZH[382 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Dehumi.CommState);
- usRegInputReg_ZH[383 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Dehumi.TempInner);
- usRegInputReg_ZH[384 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Dehumi.HumiInner);
- // usRegInputReg_ZH[392 - REG_INPUT_START_ZH] = (unsigned short)(APPL.th);
- // usRegInputReg_ZH[393 - REG_INPUT_START_ZH] = (unsigned
- // short)(env_get_temp(DEVM_RH811AD053F, 1)); usRegInputReg_ZH[394 -
- // REG_INPUT_START_ZH] = (unsigned short)(env_get_humi(DEVM_RH811AD053F,
- // 1));
- usRegInputReg_ZH[397 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Co.CommState);
- usRegInputReg_ZH[398 - REG_INPUT_START_ZH] =
- (unsigned short) (APPL.Co.Density);
- usRegInputReg_ZH[421 - REG_INPUT_START_ZH] =
- (unsigned short) 0; // 软件版本号
- usRegInputReg_ZH[422 - REG_INPUT_START_ZH] = (233 & 0xffff0000) >> 16;
- usRegInputReg_ZH[423 - REG_INPUT_START_ZH] = (233 & 0x0000ffff);
- usRegInputReg_ZH[424 - REG_INPUT_START_ZH] = (100 & 0xffff0000) >> 16;
- usRegInputReg_ZH[425 - REG_INPUT_START_ZH] = (100 & 0x0000ffff);
- usRegInputReg_ZH[501 - REG_INPUT_START_ZH] = PACK_NBR;
- usRegInputReg_ZH[502 - REG_INPUT_START_ZH] = PACK_CELL_NBR;
- memcpy(&usRegInputReg_ZH[506 - REG_INPUT_START_ZH], APPL.GaoteBms.CellVolt,
- PACK_NBR * PACK_CELL_NBR * sizeof(APPL.GaoteBms.CellVolt[0]));
- memcpy(&usRegInputReg_ZH[922 - REG_INPUT_START_ZH], APPL.GaoteBms.CellTemp,
- PACK_NBR * PACK_CELL_NBR * sizeof(APPL.GaoteBms.CellTemp[0]));
- }
- // process 03
- static void prepareRegHoldingBuf_ZH(fmodbus_t *ctx, int iAddress) {
- }
- // 06
- static void onWriteRegHoldingBuf_ZH(fmodbus_t *ctx) {
- if (usRegHoldingBuf_ZH[0 - REG_HOLDING_START_ZH] != 0) {
- syslog(LOG_INFO, "%s,get cmd(%d) form host", __func__,
- usRegHoldingBuf_ZH[0 - REG_HOLDING_START_ZH]);
- APPL.Ctl.Cmd = usRegHoldingBuf_ZH[0 - REG_HOLDING_START_ZH];
- usRegHoldingBuf_ZH[0 - REG_HOLDING_START_ZH] = 0;
- }
- if (usRegHoldingBuf_ZH[1 - REG_HOLDING_START_ZH] != 0) {
- syslog(LOG_INFO, "%s,get cmd(%d) from pda", __func__,
- usRegHoldingBuf_ZH[1 - REG_HOLDING_START_ZH]);
- APPL.Ctl.Cmd = usRegHoldingBuf_ZH[1 - REG_HOLDING_START_ZH];
- usRegHoldingBuf_ZH[1 - REG_HOLDING_START_ZH] = 0;
- }
- if ((short) usRegHoldingBuf_ZH[2 - REG_HOLDING_START_ZH] !=
- (short) (APPL.Enjoy100kW.Aps)) {
- syslog(LOG_INFO, "%s,get new aps(%d) form host", __func__,
- (short) usRegHoldingBuf_ZH[2 - REG_HOLDING_START_ZH]);
- APPL.chan485[1].Cmd = CMD_485_PCS_SET_APS;
- APPL.chan485[1].CmdParam =
- (short) usRegHoldingBuf_ZH[13 - REG_HOLDING_START_ZH];
- }
- usRegHoldingBuf_ZH[3 - REG_HOLDING_START_ZH] =
- 1; // CTN idx 始终为1,只有一台柜子
- }
- eMBErrorCode eMBRegInputCB(fmodbus_t *ctx, UCHAR *pucRegBuffer,
- USHORT usAddress, USHORT usNRegs) {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- // struct chan_t* chan = &STA.chan[ctx->chanidx];
- // if (chan->mbsidx >= 1 && chan->mbsidx <= PCS_NBR_MAX)
- if (ctx->mbsidx == MBSIDX_CTN) {
- // if ((usAddress >= REG_INPUT_START_PCS) && (usAddress + usNRegs <=
- // REG_INPUT_START_PCS + REG_INPUT_NREGS_PCS)) if ((usAddress >=
- // REG_HOLDING_START_ZH) && (usAddress + usNRegs <= REG_HOLDING_START_ZH +
- // REG_HOLDING_NREGS_ZH))
- if ((usAddress >= REG_INPUT_START_ZH) &&
- (usAddress + usNRegs <= REG_INPUT_START_ZH + REG_INPUT_REG_ZH)) {
- // iRegIndex = (int)(usAddress - usRegInputStart_PCS[chan->mbsidx]);
- onReadInputBuf_ZH(ctx);
- iRegIndex = (int) (usAddress - REG_INPUT_START_ZH);
- while (usNRegs > 0) {
- *pucRegBuffer++ = (UCHAR) (usRegInputReg_ZH[iRegIndex] >> 8);
- *pucRegBuffer++ = (UCHAR) (usRegInputReg_ZH[iRegIndex] & 0xFF);
- iRegIndex++;
- usNRegs--;
- }
- } else {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- return MB_ENOREG;
- }
- eMBErrorCode eMBRegHoldingCB(fmodbus_t *ctx, UCHAR *pucRegBuffer,
- USHORT usAddress, USHORT usNRegs,
- eMBRegisterMode eMode) {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- int i = 0;
- // struct chan_t* chan = &STA.chan[ctx->chanidx];
- // if( chan->dbg > 0 ){
- // log_dbg("%s, chanidx:%d, mbsidx:%d, mbsdevm:%d, mbsdevidx:%d,
- // usAddress:%d, usNRegs:%d, eMode:%d",
- // __func__,
- // ctx->chanidx,
- // chan->mbsidx,
- // chan->mbsdevm,
- // chan->mbsdevidx,
- // usAddress,
- // usNRegs,
- // eMode);
- // }
- // if( chan->en == 0 ){
- // return MB_EIO;
- // }
- if (ctx->mbsidx == MBSIDX_CTN) { // ctn modbus tcp slave
- if ((usAddress >= REG_HOLDING_START_ZH) &&
- (usAddress + usNRegs <= REG_HOLDING_START_ZH + REG_HOLDING_NREGS_ZH)) {
- iRegIndex = (int) (usAddress - REG_HOLDING_START_ZH);
- switch (eMode) {
- /* Pass current register values to the protocol stack. */
- case MB_REG_READ:
- prepareRegHoldingBuf_ZH(ctx, usAddress);
- while (usNRegs > 0) {
- *pucRegBuffer++ = (UCHAR) (usRegHoldingBuf_ZH[iRegIndex] >> 8);
- *pucRegBuffer++ = (UCHAR) (usRegHoldingBuf_ZH[iRegIndex] & 0xFF);
- iRegIndex++;
- usNRegs--;
- }
- break;
- /* Update current register values with new values from the
- * protocol stack. */
- case MB_REG_WRITE:
- while (usNRegs > 0) {
- usRegHoldingBuf_ZH[iRegIndex] = *pucRegBuffer++ << 8;
- usRegHoldingBuf_ZH[iRegIndex] |= *pucRegBuffer++;
- iRegIndex++;
- usNRegs--;
- }
- onWriteRegHoldingBuf_ZH(ctx);
- break;
- }
- } else {
- eStatus = MB_ENOREG;
- }
- return eStatus;
- }
- return MB_ENOERR;
- }
- eMBErrorCode eMBRegCoilsCB(fmodbus_t *ctx, UCHAR *pucRegBuffer,
- USHORT usAddress, USHORT usNCoils,
- eMBRegisterMode eMode) {
- return MB_ENOREG;
- }
- eMBErrorCode eMBRegDiscreteCB(fmodbus_t *ctx, UCHAR *pucRegBuffer,
- USHORT usAddress, USHORT usNDiscrete) {
- return MB_ENOREG;
- }
- int mbs_start_ctn(int port) {
- int ret = 0;
- const UCHAR ucSlaveID[] = {0xAA, 0xBB, 0xCC};
- pthread_t xthrd;
- if (eMBTCPInit(&MB[MBSIDX_CTN], port) != MB_ENOERR) {
- syslog(LOG_INFO, "%s, eMBTCPInit fail", __func__);
- ret = -1;
- } else if (eMBSetSlaveID(MB[MBSIDX_CTN], 0x34, TRUE, ucSlaveID, 3) !=
- MB_ENOERR) {
- syslog(LOG_INFO, "%s, eMBSetSlaveID fail", __func__);
- ret = -2;
- } else {
- MB[MBSIDX_CTN]->mbsidx = MBSIDX_CTN;
- if (pthread_create(&xthrd, NULL, pvPollingThread, MB[MBSIDX_CTN]) != 0) {
- syslog(LOG_INFO, "%s, pthread_create fail", __func__);
- ret = -3;
- } else {
- syslog(LOG_INFO, "%s, start ok", __func__);
- }
- }
- return ret;
- }
|