2013年1月29日 星期二

How to use TimerHandler ??

  1. 建議以process專屬的MQ, 設置定時器, 儘可能避免以外部process進行定時器的設置, 造成日後難以追查觸發的來源或控管不易
  2. 建議有限度地新增定時觸發事件, 以避免降低系統效能

#設置計時器, 以給定的MQ為觸發對象
TimerHandler::TimerHandler (char *mq_name);
  mq_name: process專屬的MQ名稱

ex:
TimerHandler timer (MQ_EDPLCRCV);

#新增定時觸發事件
TimerHandler::add (char *tm_name, int msec, int msg_id, void *msg, int msg_size);
  tm_name: 定時事件名稱
  msec : 間隔時間 (毫秒 milli-seconds)
  msg_id: 觸發事件代碼
  msg: 觸發資料
  msg_size: 觸發資料長度

ex:
timer.add (“Timer_AliveMsg”, 30000, MSG_TIMER_ALIVEMSG, 0, 0);
timer.add (“Timer_Hello”, 30000, MSG_TIMER_HELLO, "hello world", strlen("hello world"));

#啟動/停止/重置
TimerHandler::set_enable (char *tm_name, bool run_it);
  tm_name: 定時事件名稱
  run_it: 啟動/重置(enable), 停止(disable)

ex:
timer.set_enable (“Timer_AliveMsg”, true);
timer.set_enable (“Timer_AliveMsg”, false);

#移除定時觸發事件
TimerHandler::remove (char *tm_name);
  tm_name: 定時事件名稱

ex:
timer.remove ("Timer_AliveMsg");

#設置間隔時間 (milli-seconds)
TimerHandler::set_interval (char *tm_name, int msec);
  tm_name: 定時事件名稱
  msec: 間隔時間 (毫秒 milli-seconds)

ex:
timer.set_interval ("Timer_AliveMsg", 10000);

2013年1月5日 星期六

how to pass arguments to another process by using ApMsgHandler


鋼捲資料, ex:鋼捲號碼1830912, 厚度12mm, 重量3600kg

範例一.
試將參數化資料, 以MSMQ傳送至pdimgr

#將鋼捲資料, 以參數化方式送出至MSMQ
ApMsgHandler ApMQ = ApMsgHandler (MQ_SYS);
msginfo_body_T msg_body; memset (&msg_body, 0x00, sizeof(msginfo_body_T));
msg_body.argv[0].i16 = (short) 12;
msg_body.argv[1].i32 = (int) 3600
memcpy (msg_body.argv[2].chr, "1830912", 7);

ApMQ.send (MQ_PDIMGR, PdiMgrMsg::COILDATA, &msg_body);

#將鋼捲資料, 自MSMQ以參數化方式取出
ApMsgHandler ApMQ = ApMsgHandler (MQ_PDIMGR);
msginfo_body_T *pMsgData = (msginfo_body_T *)ApMQ.getMsgArg();

short thickness   = pMsgData->argv[0].i16;
int wgt = pMsgData->argv[1].i32;
char coilid[12] = "";
strcpy (coilid, pMsgData->argv[2].chr);

 

範例二.
試將連續性或結構性資料, 以MSMQ傳送至pdimgr

struct PDI {
    char coilid[12];   // 鋼捲號碼
    int     thk;            // 厚度
    int     wgt;           // 重量
};

#將鋼捲資料, 以結構性方式送出至MSMQ

ApMsgHandler ApMQ = ApMsgHandler (MQ_SYS);
struct PDI pdi_data;
memcpy (pdi_data.coilid, "1820912", 7);
pdi_data.thk = 12;
pdi_data.wgt = 3600;

ApMQ.send (MQ_PDIMGR, EP01, &pdi_data, sizeof(pdi_data));

#將鋼捲資料, 自MSMQ以結構性方式取出
ApMsgHandler ApMQ = ApMsgHandler (MQ_PDIMGR);
struct PDI *ptr = (struct PDI*)ApMQ.getMsgArg();

struct PDI pdi_data;
memcpy (&pdi_data, ptr, sizeof(pdi_data));