PrtIEC101.cpp
上传用户:asikq0571
上传日期:2014-07-12
资源大小:528k
文件大小:37k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. // PrtIEC101.cpp: implementation of the CPrtIEC101 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Peugeot.h"
  6. #include "PrtIEC101.h"
  7. #include "MainFrm.h"
  8. #include "PeugeotDoc.h"
  9. #include "PeugeotView.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CPrtIEC101::CPrtIEC101()
  19. {
  20.   //初始化变量
  21.     m_Addr           = 0x01;
  22.     m_CauseOfTranLen = 0x01; 
  23. m_CommAddrLen    = 0x01;     
  24.     m_MsgAddrLen     = 0x02;      
  25. m_YXChara = YX_SINGLE | TIME24;
  26.     m_YCChara = YC_TYPEA  | TIME24;
  27. m_YKChara = YK_SINGLE | YK_S_ACK | YK_E_ACK;
  28. m_FCBFlag = 0x00;
  29. m_ACDFlag = 0x00; 
  30.     
  31. int i;
  32. for (i=0; i<21; i++)
  33.    m_SRecByte[i] = 0x00;    
  34.     
  35. for (i=0; i<261; i++)
  36.        m_SSendByte[i] = 0x00;
  37.     
  38.     m_SReadState = StartByte;
  39. m_MsgIndex   = 0; 
  40. }
  41. CPrtIEC101::~CPrtIEC101()
  42. {
  43. }
  44. void CPrtIEC101::StartTimer()
  45. {
  46.   //启动主站召唤时钟
  47. //pView->SetTimer(1,m_CallIntv,NULL);
  48. }
  49. void CPrtIEC101::CloseTimer()
  50. {
  51. //关闭主站召唤时钟
  52.  // pView->KillTimer(m_CallTimerID);
  53. }
  54. void CPrtIEC101::MasterSend(UINT nIDEvent)
  55. {
  56.  //if (m_CallYXFlag)
  57.  
  58.  // CString s1;
  59.  // s1.Format ("%d",nIDEvent);
  60.  // AfxMessageBox(s1);
  61. }
  62. void CPrtIEC101::InitPrt()
  63. {
  64. // 规约初始化
  65.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  66.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();  //视图指针
  67.    ASSERT_VALID(pDoc);
  68.     m_SSendLv1      = None;            //子站发送1级数据的流程
  69.     m_SYXAddrToSend = pDoc->m_YXAddr;
  70. m_SYCAddrToSend = pDoc->m_YCAddr;
  71.     m_SYMAddrToSend = pDoc->m_YMAddr;
  72. int i = 0;
  73.   //链路复位应答报文
  74.    m_SAck_LinkR[0] = 0x10;
  75.    m_SAck_LinkR[1] = 0x80;         //最高位为传输方向,以下各帧同
  76.    m_SAck_LinkR[2] = m_Addr;
  77.    m_SAck_LinkR[3] = m_SAck_LinkR[1] + m_SAck_LinkR[2];
  78.    m_SAck_LinkR[4] = 0x16;
  79.   //请求链路状态应答报文
  80.    m_SAck_LinkS[0] = 0x10;
  81.    m_SAck_LinkS[1] = 0x8b;
  82.    m_SAck_LinkS[2] = m_Addr;
  83.    m_SAck_LinkS[3] = m_SAck_LinkS[1] + m_SAck_LinkS[2];
  84.    m_SAck_LinkS[4] = 0x16;
  85.    //应答2级数据
  86.    m_SAck_Lv2[0] = 0x10;
  87.    m_SAck_Lv2[1] = 0x89;
  88.    m_SAck_Lv2[2] = m_Addr;
  89.    m_SAck_Lv2[3] = m_SAck_Lv2[1] + m_SAck_Lv2[2];
  90.    m_SAck_Lv2[4] = 0x16;
  91.    
  92.    //总召唤应答
  93.    m_SAck_IC[0] = 0x68;
  94.    m_SAck_IC[1] = 0x05 + m_CauseOfTranLen + m_CommAddrLen + m_MsgAddrLen;
  95.    m_SAck_IC[2] = m_SAck_IC[1];
  96.    m_SAck_IC[3] = 0x68;
  97.    m_SAck_IC[4] = 0xa0;     //传输方向,及要求访问位1010 0000
  98.    m_SAck_IC[5] = m_Addr;
  99.    m_SAck_IC[6] = 0x64;     //类型标识
  100.    m_SAck_IC[7] = 0x01;
  101.    m_SAck_IC[8] = 0x07;                    //传送原因:激活确认
  102.    m_SAck_IC[9] = m_Addr;                  //如与实际字节数不符,后面仍能覆盖
  103.    
  104.    for (i=0; i<m_CommAddrLen; i++)                              //ASDU公共地址               
  105.        m_SAck_IC[8+m_CauseOfTranLen+i] = m_Addr;
  106.    for (i=0; i<m_MsgAddrLen; i++)
  107.        m_SAck_IC[8+m_CauseOfTranLen+m_CommAddrLen+i] = 0x00;  //信息体公共地址 
  108.    m_SAck_IC[3+m_SAck_IC[1]] = 0x14;     //站召唤
  109.    m_SAck_IC[4+m_SAck_IC[1]] = GetAddByte(m_SAck_IC,m_SAck_IC[1],4);     //和校验
  110.    m_SAck_IC[5+m_SAck_IC[1]] = 0x16;
  111.    //总召唤结束
  112.    m_SAck_IC_End[0] = 0x68;
  113.    m_SAck_IC_End[1] = 0x05 + m_CauseOfTranLen + m_CommAddrLen + m_MsgAddrLen;
  114.    m_SAck_IC_End[2] = m_SAck_IC_End[1];
  115.    m_SAck_IC_End[3] = 0x68;
  116.    m_SAck_IC_End[4] = 0x80 + 0x08;     //传输方向,要求访问位为0
  117.    m_SAck_IC_End[5] = m_Addr;
  118.    m_SAck_IC_End[6] = 0x64;     //类型标识
  119.    m_SAck_IC_End[7] = 0x01;
  120.    m_SAck_IC_End[8] = 0x0a;            //传送原因:激活中止
  121.    m_SAck_IC_End[9] = m_Addr;          //如与实际字节数不符,后面仍能覆盖
  122.                 
  123.    
  124.    for (i=0; i<m_CommAddrLen; i++)                              //ASDU公共地址               
  125.        m_SAck_IC_End[8+m_CauseOfTranLen+i] = m_Addr;
  126.    for (i=0; i<m_MsgAddrLen; i++)
  127.        m_SAck_IC_End[8+m_CauseOfTranLen+m_CommAddrLen+i] = 0x00; //信息体公共地址 
  128.    m_SAck_IC_End[3+m_SAck_IC_End[1]] = 0x14;     //站召唤
  129.    m_SAck_IC_End[4+m_SAck_IC_End[1]] = GetAddByte(m_SAck_IC_End,m_SAck_IC_End[1],4);  //和校验
  130.    m_SAck_IC_End[5+m_SAck_IC_End[1]] = 0x16;
  131. }
  132. void CPrtIEC101::MasterRec(BYTE recByte)
  133. {
  134. }
  135. //子站接收主站报文
  136. void CPrtIEC101::SlaveRec(BYTE recByte)
  137. {
  138.   CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;        //框架窗口指针;
  139.   CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView(); //视图指针
  140.   ASSERT_VALID(pView);  
  141.   switch (m_SReadState)
  142.   {
  143.   case StartByte:
  144.    m_SRecByte[0] = recByte;
  145.    if (m_SRecByte[0] == 0x10)
  146.            m_SReadState = CtrlByte;
  147.        else if (m_SRecByte[0] == 0x68)
  148.            m_SReadState = Num_68H_1;
  149.        break;
  150.   //===========  启动字符为10H  ==========//
  151.   case CtrlByte:
  152.        m_SRecByte[1] = recByte;
  153.        m_SReadState  = AddrByte;
  154.        break;
  155.   case AddrByte:
  156.    if ( recByte == m_Addr)
  157.    {
  158.  m_SRecByte[2] = recByte;
  159.          m_SReadState  = CheckByte;
  160.    }
  161.    else
  162.          m_SReadState  = StartByte; 
  163.    break;
  164.   case CheckByte:
  165.    m_SRecByte[3] = recByte;
  166.        BYTE b1 ;
  167.    b1 = m_SRecByte[1] + m_SRecByte[2];
  168.        if (m_SRecByte[3] == b1)
  169.        m_SReadState  = EndByte;
  170.    else
  171.            m_SReadState  = StartByte;
  172.    break;
  173.   case EndByte:                  //启动字符为10H的报文接收完毕,解包
  174.    m_SRecByte[4] = recByte;
  175.       if (m_SRecByte[4] == 0X16)
  176.    SUnPack_Start10H();        //解包
  177.        m_SReadState = StartByte;
  178.    break;
  179.       //===========  启动字符为68H  ==========//
  180.   case Num_68H_1:
  181.    m_SRecByte[1] = recByte;
  182.        m_SReadState  = Num_68H_2;
  183.    break;
  184.   case Num_68H_2:
  185.    m_SRecByte[2] = recByte;
  186.    if (m_SRecByte[2] == m_SRecByte[1])
  187.            m_SReadState = Start_68H_2;
  188.    else
  189.            m_SReadState = StartByte;
  190.    break;
  191.   case Start_68H_2:
  192.    m_SRecByte[3] = recByte;
  193.        if (m_SRecByte[3] == 0x68)
  194.    {
  195.    m_MsgIndex   = 0;
  196.    m_SReadState = Msg_68H;
  197.    }
  198.    else
  199.            m_SReadState = StartByte;
  200.    break;
  201.   case Msg_68H:
  202.    m_SRecByte[4+m_MsgIndex] = recByte;
  203.    if (m_MsgIndex < (m_SRecByte[1]-1))   // 如读取的字节数小于信息字节数,则继续读取
  204.    m_MsgIndex++;
  205.    else
  206.    { 
  207.    m_SReadState = Check_68H;
  208.    m_MsgIndex   = 0;
  209.    }
  210.    break;
  211.   case Check_68H:
  212.        m_SRecByte[4+m_SRecByte[1]] = recByte;
  213.        BYTE tembyte;
  214.        tembyte = GetAddByte(m_SRecByte,m_SRecByte[1],4);
  215.    if (m_SRecByte[4+m_SRecByte[1]] == tembyte)
  216.            m_SReadState = End_68H;
  217.    else
  218.            m_SReadState = StartByte;
  219.    break;
  220.   case End_68H:              //启动字符为68H的报文接收完毕,解包
  221.    m_SRecByte[5+m_SRecByte[1]] = recByte;
  222.    if (m_SRecByte[5+m_SRecByte[1]] == 0X16 && 
  223.    m_SRecByte[5] == m_Addr)
  224.    SUnPack_Start68H();    //解包
  225.    
  226.    m_SReadState = StartByte;
  227.    break;
  228.   ///////////////////////////////////////////////   
  229.   default:
  230.        m_SReadState = StartByte;      //重新从地址码读取
  231.    break;
  232.   }
  233. }
  234. void CPrtIEC101::SlaveSend()
  235. {
  236. }
  237. //解包 10H
  238. void CPrtIEC101::SUnPack_Start10H()
  239. {
  240.    switch (m_SRecByte[1] & 0x0f)
  241.    {
  242.    case 0x00:
  243.    SUnPack_FC00H();
  244.    break;
  245.   
  246.    case 0x09:
  247.    SUnPack_FC09H();
  248.    break;
  249.    case 0x0b:
  250.        SUnPack_FC0bH();
  251.    break;
  252.    case 0x0a:
  253.    SUnPack_FC0aH();
  254.    break;
  255.    default:
  256.        SUnPack_Start10H_Unknow();
  257.    break;
  258.    }
  259. }
  260. //解包 68H
  261. void CPrtIEC101::SUnPack_Start68H()
  262. {
  263.    switch (m_SRecByte[6])       //类型标识
  264.    {
  265.    case 0x64:                   //总召唤
  266.    SUnPack_TypeID64H();
  267.    break;
  268.    case 0x67:
  269.        SUnPack_TypeID67H();     //主站对时
  270.    break;
  271.    case 0x2d:    
  272.    SUnPack_TypeID2DH();     //单点遥控
  273.    break;
  274.    case 0x2e:
  275.    SUnPack_TypeID2EH();     //双点遥控
  276.    break;
  277.    case 0x65:                   
  278.    SUnPack_TypeID65H();    //二进制计数器读数(BCR) -- 电度累计量
  279.    break;
  280.    default:
  281.        SUnPack_Start68H_Unknow();
  282.    break;
  283.    }
  284. }
  285. //接收/应答主站总召唤
  286. void CPrtIEC101::SUnPack_TypeID64H()
  287. {
  288.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  289.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  290.    ASSERT_VALID(pView);
  291.    DWORD dwBytesSended = 0;
  292.    CString s1 = "";
  293.    s1 = "<Rec>: 101主站--总召唤";
  294.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  295.    pView->DisplayMsg(s1);                             //显示召唤报文
  296.    if (pView->Send(m_SAck_IC,6+m_SAck_IC[1],dwBytesSended))     //发送应答报文并显示
  297.    {
  298.          s1 = "<Send>:101子站--总召唤确认";
  299.  s1 = s1 + "rn" + ByteArrayToString(m_SAck_IC,6+m_SAck_IC[1]) + "rn";
  300.          pView->DisplayMsg(s1);
  301.  m_SSendLv1 = YX;
  302.  m_ACDFlag  = 0x20;
  303.    }
  304. }
  305. void CPrtIEC101::SUnPack_Start68H_Unknow()
  306. {
  307.   CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  308.   CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  309.   ASSERT_VALID(pView);
  310.   CString s1 = "";
  311.   s1 = "<Rec>: 101主站--未知命令";
  312.   s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  313.   pView->DisplayMsg(s1);     //显示召唤报文
  314. }
  315. void CPrtIEC101::SUnPack_Start10H_Unknow()
  316. {
  317.   CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  318.   CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  319.   ASSERT_VALID(pView);
  320.   CString s1 = "";
  321.   s1 = "<Rec>: 101主站--未知命令";
  322.   s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,5) + "rn";
  323.   pView->DisplayMsg(s1);     //显示召唤报文
  324. }
  325. void CPrtIEC101::SUnPack_FC00H()
  326. {
  327.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  328.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  329.    ASSERT_VALID(pView);
  330.    DWORD dwBytesSended = 0;
  331.    CString s1 = "";
  332.     
  333.    s1 = "<Rec>: 101主站--远方复位链路";
  334.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,5) + "rn";
  335.    pView->DisplayMsg(s1);     //显示召唤报文
  336.   
  337.    if (pView->Send(m_SAck_LinkR,5,dwBytesSended))     //发送应答报文并显示
  338.    {
  339.        s1 = "<Send>:101子站--复位链路确认";
  340.    s1 = s1 + "rn" + ByteArrayToString(m_SAck_LinkR,5) + "rn";
  341.        pView->DisplayMsg(s1);
  342.    }
  343. }
  344. void CPrtIEC101::SUnPack_FC09H()
  345. {
  346.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  347.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  348.    ASSERT_VALID(pView);
  349.    DWORD dwBytesSended = 0;
  350.    CString s1 = "";
  351.    s1 = "<Rec>:101主站--请求链路状态";
  352.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,5) + "rn";
  353.    pView->DisplayMsg(s1);     //显示召唤报文
  354.    if (pView->Send(m_SAck_LinkS,5,dwBytesSended))     //发送应答报文并显示
  355.    {
  356.        s1 = "<Send>:101子站--链路状态应答";
  357.    s1 = s1 + "rn" + ByteArrayToString(m_SAck_LinkS,5) + "rn";
  358.        pView->DisplayMsg(s1);
  359.    }
  360. }
  361. //接收/应答 ‘召2级数据’
  362. void CPrtIEC101::SUnPack_FC0bH()
  363. {
  364.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  365.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  366.    ASSERT_VALID(pView);
  367.    DWORD dwBytesSended = 0;
  368.    CString s1 = "";
  369.    s1 = "<Rec>:101主站--召2级数据";
  370.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,5) + "rn";
  371.    pView->DisplayMsg(s1);     //显示召唤报文
  372.    if (pView->Send(m_SAck_Lv2,5,dwBytesSended))     //发送应答报文并显示
  373.    {
  374.        s1 = "<Send>:101子站--无数据";
  375.    s1 = s1 + "rn" + ByteArrayToString(m_SAck_Lv2,5) + "rn";
  376.        pView->DisplayMsg(s1);
  377.    }
  378. }
  379. //接收/应答 ‘召1级数据’
  380. void CPrtIEC101::SUnPack_FC0aH()
  381. {
  382.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  383.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  384.    ASSERT_VALID(pView);
  385.    DWORD dwBytesSended = 0;
  386.    CString s1 = "";
  387.    s1 = "<Rec>:101主站--召1级数据";
  388.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,5) + "rn";
  389.    pView->DisplayMsg(s1);     //显示召唤报文 
  390.    switch (m_SSendLv1)
  391.    {
  392.    case YX:
  393.    SlaveSend_Lv1YX();
  394.    break;
  395.    case YC:
  396.        SlaveSend_Lv1YC();
  397.    break;
  398.    case None:
  399.        SlaveSend_Lv1End();
  400.    break;
  401.    default:
  402.    m_SSendLv1 = None;
  403.        break;
  404.    }
  405. }
  406. void CPrtIEC101::SlaveSend_Lv1YX()
  407. {
  408.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  409.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  410.    ASSERT_VALID(pView);
  411.    DWORD dwBytesSended = 0;
  412.    CString s1 = "";
  413.    SPack_M_SP_DP_NA();     //打遥信包
  414.  
  415.    if((m_YXChara & 0x01) == YX_SINGLE)
  416.    s1 = "<Send>:101子站--单点信息 M_SP_NA";
  417.    else
  418.        s1 = "<Send>:101子站--双点信息 M_DP_NA";
  419.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  420.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  421.        pView->DisplayMsg(s1);
  422. }
  423. void CPrtIEC101::SlaveSend_Lv1YC()
  424. {
  425.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  426.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  427.    ASSERT_VALID(pView);
  428.    DWORD dwBytesSended = 0;
  429.    CString s1 = "";
  430.    SPack_M_ME_ND();     //打遥测包,目前总召唤遥测按不带品质的归一化类型
  431.  
  432.    s1 = "<Send>:101子站--遥测值,不带品质描述的归一化值 M_ME_ND";
  433.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  434.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  435.        pView->DisplayMsg(s1);
  436. }
  437. void CPrtIEC101::SPack_M_SP_DP_NA()
  438. {
  439.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  440.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();   //文档指针
  441.    ASSERT_VALID(pDoc);
  442.    //int nMaxNumToSend;              //1帧最大发送的遥信个数
  443.    int nYXNumToSend;               //
  444.    BOOL IsFullSended = false;      //遥信点信息是否全部发送
  445.   // nMaxNumToSend = 255-2-1-1-m_CauseOfTranLen-m_CommAddrLen-m_MsgAddrLen;
  446.    nYXNumToSend  = pDoc->m_YXNum - (m_SYXAddrToSend - pDoc->m_YXAddr);
  447.    
  448.    if (nYXNumToSend > 0x7f)
  449.        nYXNumToSend = 0x7f; 
  450.    else
  451.        IsFullSended   = true;              //本帧能全部发送遥信
  452.    m_SSendByte[0] = 0x68;
  453.    m_SSendByte[1] = nYXNumToSend+2+1+1+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen;
  454.    m_SSendByte[2] = m_SSendByte[1];
  455.    m_SSendByte[3] = 0x68;
  456.    m_SSendByte[4] = 0x80 + m_ACDFlag + 0x08;   //功能码
  457.    m_SSendByte[5] = m_Addr;
  458.  //m_SSendByte[6] = TypeID:Single OR Double 
  459.    m_SSendByte[7] = 0x80 + nYXNumToSend;   //SQ=1
  460.    m_SSendByte[8] = 0x14;                  //传送原因:响应站召唤
  461.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  462.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;
  463.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  464.    WORD temVar = 0x0000;
  465.    temVar = (WORD)m_SYXAddrToSend;      //信息体地址
  466.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen]   = LOBYTE(temVar);
  467.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = HIBYTE(temVar);    //如与实际字节数不符,后面仍能覆盖
  468.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+2] = 0x00;
  469.    
  470.    for (int i=0; i<nYXNumToSend; i++)
  471.         m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen+i] 
  472. = pDoc->m_pYXData[m_SYXAddrToSend-pDoc->m_YXAddr+i];
  473.    if ((m_YXChara & 0x01) == 0)
  474.        m_SSendByte[6] = 0x01;
  475.    else
  476.         m_SSendByte[6] = 0x03;
  477.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  478.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  479.    /////////////////////////////////////////////////////////
  480.    if (IsFullSended)
  481.    {
  482.    m_SSendLv1      = YC;
  483.        m_SYXAddrToSend = pDoc->m_YXAddr;
  484.    }
  485.    else
  486.    m_SYXAddrToSend = m_SYXAddrToSend + 0x7f;
  487. }
  488. void CPrtIEC101::SPack_M_ME_ND()
  489. {
  490.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  491.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();   //文档指针
  492.    ASSERT_VALID(pDoc);
  493.    int nMaxNumToSend;              //1帧最大发送的遥测个数
  494.    int nYCNumToSend;               //
  495.    BOOL IsFullSended = false;      //遥测点信息是否全部发送
  496.    nMaxNumToSend = (255-2-1-1-m_CauseOfTranLen-m_CommAddrLen-m_MsgAddrLen)/2;  //每个遥测两个字节
  497.    nYCNumToSend  = pDoc->m_YCNum - (m_SYCAddrToSend - pDoc->m_YCAddr);
  498.    
  499.    if (nYCNumToSend > nMaxNumToSend)
  500.        nYCNumToSend = nMaxNumToSend; 
  501.    else
  502.        IsFullSended   = true;              //本帧能全部发送遥测
  503.    m_SSendByte[0] = 0x68;
  504.    m_SSendByte[1] = nYCNumToSend*2+2+1+1+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen;
  505.    m_SSendByte[2] = m_SSendByte[1];
  506.    m_SSendByte[3] = 0x68;
  507.    m_SSendByte[4] = 0x80 + m_ACDFlag + 0x08;   //功能码
  508.    m_SSendByte[5] = m_Addr;
  509.    m_SSendByte[6] = 0x15;                  //类型标识 21 
  510.    m_SSendByte[7] = 0x80 + nYCNumToSend;   //SQ=1
  511.    m_SSendByte[8] = 0x14;                  //传送原因:响应站召唤
  512.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  513.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;
  514.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  515.    WORD temVar = 0x0000;
  516.    temVar = (WORD)m_SYCAddrToSend;      //信息体地址
  517.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen]   = LOBYTE(temVar);
  518.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = HIBYTE(temVar);    //如与实际字节数不符,后面仍能覆盖
  519.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+2] = 0x00;
  520.    
  521.    int i,j;
  522.    j = 8+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen;
  523.    for (i=0; i<nYCNumToSend; i++)
  524.    {
  525.        temVar = pDoc->m_pYCData[m_SYCAddrToSend-pDoc->m_YCAddr+i];
  526.    m_SSendByte[j+i*2]   = LOBYTE(temVar);
  527.    m_SSendByte[j+i*2+1] = HIBYTE(temVar);
  528.    }
  529.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  530.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  531.    /////////////////////////////////////////////////////////
  532.    if (IsFullSended)
  533.    {
  534.    m_SSendLv1      = None;
  535.        m_SYCAddrToSend = pDoc->m_YCAddr;
  536.    }
  537.    else
  538.    m_SYCAddrToSend = m_SYCAddrToSend + nYCNumToSend;
  539. }
  540. //void CPrtIEC101::SPack_M_DP_NA()
  541. //{
  542. //}
  543. void CPrtIEC101::SlaveSend_Lv1End()
  544. {
  545.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  546.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  547.    ASSERT_VALID(pView);
  548.    DWORD dwBytesSended = 0;
  549.    CString s1 = "";
  550.    s1 = "<Send>:101子站--总召唤结束";
  551.    s1 = s1 + "rn" + ByteArrayToString(m_SAck_IC_End,6+m_SAck_IC_End[1]) + "rn";
  552.    if (pView->Send(m_SAck_IC_End,6+m_SAck_IC_End[1],dwBytesSended))     //发送应答报文并显示
  553.        pView->DisplayMsg(s1);
  554. }
  555. //接收时钟同步命令
  556. void CPrtIEC101::SUnPack_TypeID67H()
  557. {
  558.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  559.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  560.    ASSERT_VALID(pView);
  561.    BYTE nYear, nMonth, nDay, nHour, nMin; //nSec, nSec_m
  562.    WORD wSec;
  563.    float fSec;
  564.    nYear  = m_SRecByte[m_SRecByte[1]+3];
  565.    nMonth = m_SRecByte[m_SRecByte[1]+2];
  566.    nDay   = m_SRecByte[m_SRecByte[1]+1] & 0x1f;
  567.    nHour  = m_SRecByte[m_SRecByte[1]];
  568.    nMin   = m_SRecByte[m_SRecByte[1]-1];
  569.    wSec   = (m_SRecByte[m_SRecByte[1]-2]<<8) | m_SRecByte[m_SRecByte[1]-3];
  570.    fSec   = (float)wSec/1000;
  571.    
  572.    DWORD dwBytesSended = 0;
  573.    CString s1 = "";
  574.   
  575.    if (nYear < 0x0a)
  576.    s1.Format("时钟同步 200%d-%d-%d %d:%d:%2.3f",nYear,nMonth,nDay,nHour,nMin,fSec);//%2.3f 保留三位小数点
  577.    else
  578.    s1.Format("时钟同步 20%d-%d-%d %d:%d:%2.3f",nYear,nMonth,nDay,nHour,nMin,fSec);
  579.    pMainFrame->DisplayEvent(1,s1);    //消息窗口显示
  580.    s1 = "<Rec>: 101主站--" + s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  581.    pView->DisplayMsg(s1);    
  582.    
  583.    //应答时钟同步
  584.    m_SSendByte[0] = 0x68;
  585.    m_SSendByte[1] = 2+1+1+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen+7;
  586.    m_SSendByte[2] = m_SSendByte[1];
  587.    m_SSendByte[3] = 0x68;
  588.    m_SSendByte[4] = 0x80;     //功能码0x80+0x00
  589.    m_SSendByte[5] = m_Addr;
  590.    m_SSendByte[6] = 0x67;     //类型标识 103 
  591.    m_SSendByte[7] = 0x01;     //SQ=0
  592.    m_SSendByte[8] = 0x07;                  //传送原因:激活确认
  593.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  594.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;
  595.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  596.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen] = 0x00;   //信息体公共地址 
  597.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = 0x00; //如与实际字节数不符,后面仍能覆盖
  598.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+2] = 0x00;
  599.    for (int i=0; i<7; i++)
  600.         m_SSendByte[m_SSendByte[1]-3+i] = m_SRecByte[m_SRecByte[1]-3+i];
  601.  
  602.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  603.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  604.    s1 ="<Send>: 101子站--时钟同步确认";
  605.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  606.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))
  607.        pView->DisplayMsg(s1);  
  608. }
  609. //24位时标的单点/双点信息报文
  610. void CPrtIEC101::SPack_M_SP_DP_TA(int nIndex, int nNumber)
  611. {
  612.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  613.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();   //文档指针
  614.    ASSERT_VALID(pDoc);
  615.    m_SSendByte[0] = 0x68;
  616.    m_SSendByte[1] = 2+1+1+m_CauseOfTranLen+m_CommAddrLen+(m_MsgAddrLen+4)*nNumber;
  617.    m_SSendByte[2] = m_SSendByte[1];
  618.    m_SSendByte[3] = 0x68;
  619.    m_SSendByte[4] = 0x80 + 0x08;   //功能码
  620.    m_SSendByte[5] = m_Addr;
  621.  //m_SSendByte[6] = TypeID:Single OR Double 
  622.    m_SSendByte[7] = 0x00 + nNumber;   //SQ=0
  623.    m_SSendByte[8] = 0x03;                  //传送原因:自发(突发)
  624.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  625.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;   //公共体地址
  626.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  627.    WORD wtemVar = 0x0000;
  628.    WORD wSec;
  629.    int  ntemVar;
  630.    ntemVar = 8+m_CauseOfTranLen+m_CommAddrLen;    //信息体之前的字节数
  631.    SYSTEMTIME t1;             //时间结构
  632.    GetLocalTime(&t1);
  633.    wSec = t1.wSecond*1000 + t1.wMilliseconds;      //毫秒
  634.    for (int i=0; i<nNumber; i++)
  635.    {
  636.   wtemVar = (WORD)(pDoc->m_YXAddr + nIndex + i);      //第nIndex+i信息体地址
  637.       
  638.   m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i]   = LOBYTE(wtemVar);    
  639.       m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+1] = HIBYTE(wtemVar);    //如与实际字节数不符,后面仍能覆盖
  640.       m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+2] = 0x00;
  641.    
  642.   m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+m_MsgAddrLen]   = pDoc->m_pYXData[nIndex+i];
  643.   
  644.       m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+m_MsgAddrLen+1] = LOBYTE(wSec);      //3字节时标CTime
  645.   m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+m_MsgAddrLen+2] = HIBYTE(wSec);
  646.   m_SSendByte[ntemVar+(m_MsgAddrLen+4)*i+m_MsgAddrLen+3] = (BYTE)t1.wMinute;
  647.    }
  648.    if ((m_YXChara & 0x01) == 0)
  649.        m_SSendByte[6] = 0x02;
  650.    else
  651.         m_SSendByte[6] = 0x04;
  652.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  653.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  654. }
  655. //56位时标的单点/双点信息报文
  656. void CPrtIEC101::SPack_M_SP_DP_TB(int nIndex, int nNumber)
  657. {
  658.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  659.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();   //文档指针
  660.    ASSERT_VALID(pDoc);
  661.    m_SSendByte[0] = 0x68;
  662.    m_SSendByte[1] = 2+1+1+m_CauseOfTranLen+m_CommAddrLen+(m_MsgAddrLen+8)*nNumber;
  663.    m_SSendByte[2] = m_SSendByte[1];
  664.    m_SSendByte[3] = 0x68;
  665.    m_SSendByte[4] = 0x80 + 0x08;   //功能码
  666.    m_SSendByte[5] = m_Addr;
  667.  //m_SSendByte[6] = TypeID:Single OR Double 
  668.    m_SSendByte[7] = 0x00 + nNumber;   //SQ=0
  669.    m_SSendByte[8] = 0x03;                  //传送原因:自发(突发)
  670.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  671.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;   //公共体地址
  672.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  673.    WORD wtemVar = 0x0000;
  674.    WORD wSec;
  675.    int  ntemVar;
  676.    ntemVar = 8+m_CauseOfTranLen+m_CommAddrLen;    //信息体之前的字节数
  677.    SYSTEMTIME t1;             //时间结构
  678.    GetLocalTime(&t1);
  679.    wSec = t1.wSecond*1000 + t1.wMilliseconds;      //毫秒
  680.    for (int i=0; i<nNumber; i++)
  681.    {
  682.   wtemVar = (WORD)(pDoc->m_YXAddr + nIndex + i);      //第nIndex+i信息体地址
  683.       
  684.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i]   = LOBYTE(wtemVar);    
  685.       m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+1] = HIBYTE(wtemVar);    //如与实际字节数不符,后面仍能覆盖
  686.       m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+2] = 0x00;
  687.    
  688.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen]   = pDoc->m_pYXData[nIndex+i];
  689.   
  690.       m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+1] = LOBYTE(wSec);      //3字节时标CTime 
  691.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+2] = HIBYTE(wSec);
  692.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+3] = (BYTE)t1.wMinute;  //分
  693.       m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+4] = (BYTE)t1.wHour;    //时
  694.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+5] = (BYTE)t1.wDayOfWeek<<5 | (BYTE)t1.wDay;  //日
  695.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+6] = (BYTE)t1.wMonth;   //月
  696.   m_SSendByte[ntemVar+(m_MsgAddrLen+8)*i+m_MsgAddrLen+7] = (BYTE)(t1.wYear % 100);  //年(余除100)
  697.    }
  698.    if ((m_YXChara & 0x01) == 0)
  699.        m_SSendByte[6] = 0x1e;    //typeid:30
  700.    else
  701.         m_SSendByte[6] = 0x1f;    //typeid:31
  702.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  703.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  704. }
  705. void CPrtIEC101::SlaveSend_ChangeYX(UINT nIndex, UINT nNumber)
  706. {
  707.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  708.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  709.    ASSERT_VALID(pView);
  710.    DWORD dwBytesSended = 0;
  711.    CString s1 = "";
  712.    if ((m_YXChara & 0x02) == TIME24)
  713.    {
  714.       s1 = "<Send>:101子站--带24位时标的";
  715.   SPack_M_SP_DP_TA(nIndex,nNumber);     //24位时标单(双)点遥信打包
  716.    }
  717.    else
  718.    {
  719.   s1 = "<Send>:101子站--带56位时标的";
  720.   SPack_M_SP_DP_TB(nIndex,nNumber);     //56位时标单(双)点遥信打包
  721.    }
  722.    
  723.    if ((m_YXChara & 0x01) == YX_SINGLE)
  724.       s1 = s1+"单点遥信(突发)";
  725.    else
  726.   s1 = s1+"双点遥信(突发)";
  727.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  728.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  729.        pView->DisplayMsg(s1);
  730. }
  731. void CPrtIEC101::SUnPack_TypeID2DH()
  732. {
  733.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  734.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  735.    ASSERT_VALID(pView);
  736.    DWORD dwBytesSended = 0;
  737.    CString s1 = "";
  738.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x80) == 0x80)   //遥控选择
  739.        s1 = "<Rec>: 101主站--单点命令:遥控选择"; 
  740.    else
  741.        s1 = "<Rec>: 101主站--单点命令:遥控执行"; 
  742.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x01) == 0x01)    //合闸
  743.        s1 = s1 + "(合闸)";
  744.    else
  745.        s1 = s1 + "(分闸)";
  746.    CString s2;
  747.    if (m_MsgAddrLen == 2)
  748.       s2 = ByteToString(m_SRecByte[m_SRecByte[1]+2]) + ByteToString(m_SRecByte[m_SRecByte[1]+1]);
  749.    else //信息体地址为3字节
  750.       s2 = ByteToString(m_SRecByte[m_SRecByte[1]+2]) + ByteToString(m_SRecByte[m_SRecByte[1]+1])
  751.          + ByteToString(m_SRecByte[m_SRecByte[1]]);
  752.    s1 = s1 + " Addr:" + s2;
  753.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  754.    pView->DisplayMsg(s1);  
  755.    SPack_C_SC_DC_Echo();   //遥控应答打包
  756.    if ((m_SSendByte[4] & 0x01) == 0)
  757.       s1 = "<Send>: 101子站--单点命令:确认";
  758.    else
  759.       s1 = "<Send>: 101子站--单点命令:否定应答";
  760.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  761.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  762.        pView->DisplayMsg(s1);
  763. }
  764. void CPrtIEC101::SUnPack_TypeID2EH()
  765. {
  766.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  767.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  768.    ASSERT_VALID(pView);
  769.    DWORD dwBytesSended = 0;
  770.    CString s1 = "";
  771.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x80) == 0x80)   //遥控选择
  772.        s1 = "<Rec>: 101主站--双点命令:遥控选择"; 
  773.    else
  774.        s1 = "<Rec>: 101主站--双点命令:遥控执行"; 
  775.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x03) == 0x02)         //合闸
  776.        s1 = s1 + "(合闸)";
  777.    else if ((m_SRecByte[m_SRecByte[1]+3] & 0x03) == 0x01)    //分闸
  778.        s1 = s1 + "(分闸)";
  779.    else
  780.    {
  781.    s1 = s1 + "(不允许)";
  782.        s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  783.        pView->DisplayMsg(s1); 
  784.    return;
  785.    }
  786.    CString s2;
  787.    if (m_MsgAddrLen == 2)
  788.       s2 = ByteToString(m_SRecByte[m_SRecByte[1]+2]) + ByteToString(m_SRecByte[m_SRecByte[1]+1]);
  789.    else //信息体地址为3字节
  790.       s2 = ByteToString(m_SRecByte[m_SRecByte[1]+2]) + ByteToString(m_SRecByte[m_SRecByte[1]+1])
  791.          + ByteToString(m_SRecByte[m_SRecByte[1]]);
  792.    s1 = s1 + " Addr:" + s2;
  793.    s1 = s1 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  794.    pView->DisplayMsg(s1);  
  795.    SPack_C_SC_DC_Echo();   //遥控应答打包
  796.    if ((m_SSendByte[4] & 0x01) == 0)
  797.       s1 = "<Send>: 101子站--双点命令:确认";
  798.    else
  799.       s1 = "<Send>: 101子站--双点命令:否定应答";
  800.    s1 = s1 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  801.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  802.        pView->DisplayMsg(s1);
  803. }
  804. //子站应答遥控命令(单点/双点)m_SRecByte  m_SSendByte
  805. void CPrtIEC101::SPack_C_SC_DC_Echo()
  806. {
  807.    m_SSendByte[0] = 0x68;
  808.    m_SSendByte[1] = 0x05 + m_CauseOfTranLen + m_CommAddrLen + m_MsgAddrLen;
  809.    m_SSendByte[2] = m_SSendByte[1];
  810.    m_SSendByte[3] = 0x68;
  811.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x80) == 0x80)        //‘选择’应答
  812.        m_SSendByte[4] = 0x80 | ((m_YKChara & 0x02)>>1);     //传输方向+应答方式
  813.    else    //‘执行’应答                                                 
  814.        m_SSendByte[4] = 0x80 | ((m_YKChara & 0x04)>>2); 
  815.    
  816.    m_SSendByte[5] = m_Addr;
  817.    m_SSendByte[6] = m_SRecByte[6];     //类型标识
  818.    m_SSendByte[7] = 0x01;
  819.    m_SSendByte[8] = 0x07;                    //传送原因:激活确认
  820.    m_SSendByte[9] = m_Addr;                  //如与实际字节数不符,后面仍能覆盖
  821.    
  822.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;  //ASDU公共地址             
  823.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;  //如与实际字节数不符,后面仍能覆盖
  824.    if (m_MsgAddrLen == 2)
  825.    {    
  826.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen]   = m_SRecByte[m_SRecByte[1]+1];
  827.        m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = m_SRecByte[m_SRecByte[1]+2];
  828.    }
  829.    else //信息体地址为3字节
  830.    {    
  831.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen]   = m_SRecByte[m_SRecByte[1]];
  832.        m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = m_SRecByte[m_SRecByte[1]+1];
  833.        m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+2] = m_SRecByte[m_SRecByte[1]+2];
  834.    }
  835.    m_SSendByte[3+m_SSendByte[1]] = m_SRecByte[m_SRecByte[1]+3];     //SCO OR DC0
  836.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);     //和校验
  837.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  838. }
  839. void CPrtIEC101::SUnPack_TypeID65H()
  840. {
  841.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;           //框架窗口指针;
  842.    CPeugeotView* pView    = (CPeugeotView*) pMainFrame->GetActiveView();    //视图指针
  843.    ASSERT_VALID(pView);
  844.    DWORD dwBytesSended = 0;
  845.    CString s1 = "";
  846.    CString s2 = "";
  847.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x07) < 0x04)   //计数量召唤命令限定词(QCC)->RQT  仅取低3位
  848.    s1.Format("计数量召唤:第%d组",m_SRecByte[m_SRecByte[1]+3] & 0x07);
  849.    else if((m_SRecByte[m_SRecByte[1]+3] & 0x07) == 0x05)
  850.        s1 = "计数量召唤:总请求";
  851.    else
  852.    s1 = "计数量召唤:未知命令(保留)";
  853.    switch (m_SRecByte[m_SRecByte[1]+3] & 0xc0)        //计数量召唤命令限定词(QCC)->FRZ bit7~8
  854.    {
  855.    case 0x00:
  856.    s2 =  "(读命令)";
  857.    break;
  858.    
  859.    case 0x40:
  860.    s2 =  "(冻结不带复位)";
  861.    break;
  862.    case 0x80:
  863.    s2 =  "(冻结带复位)";
  864.    break;
  865.    case 0xc0:
  866.    s2 =  "(复位命令)";
  867.    break;
  868.    default:
  869.    s2 =  "(读命令)";
  870.    break;
  871.    }
  872.    s1 = "<Rec>: 101主站--" + s1 + s2 + "rn" + ByteArrayToString(m_SRecByte,6+m_SRecByte[1]) + "rn";
  873.    pView->DisplayMsg(s1);
  874.    if (m_SRecByte[m_SRecByte[1]+3] & 0xc0 == 0x00)
  875.    {
  876.    SPack_IT_NA();
  877.    s2 = "脉冲数据";
  878.    }
  879.    else
  880.    {
  881.        SPack_C_CI_ACK();
  882.    s2 = s2 + "确认应答";
  883.    }
  884.    s1 = "<Send>: 101子站--" + s2 + "rn" + ByteArrayToString(m_SSendByte,6+m_SSendByte[1]) + "rn";
  885.    if (pView->Send(m_SSendByte,6+m_SSendByte[1],dwBytesSended))     //发送应答报文并显示
  886.        pView->DisplayMsg(s1);
  887. }
  888. //子站发送脉冲电度(不带时标)SQ = 1
  889. void CPrtIEC101::SPack_IT_NA()
  890. {
  891.    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;             //框架窗口指针;
  892.    CPeugeotDoc* pDoc      = (CPeugeotDoc*) pMainFrame->GetActiveDocument();   //文档指针
  893.    ASSERT_VALID(pDoc);
  894.    int nMaxNumToSend;              //1帧最大发送的电度个数
  895.    int nYMNumToSend;               //
  896.    BOOL IsFullSended = false;      //脉冲点信息是否全部发送
  897.    //nMaxNumToSend = (255-2-1-1-m_CauseOfTranLen-m_CommAddrLen) / (m_MsgAddrLen+5);  // SQ = 0
  898.    nMaxNumToSend = (255-2-1-1-m_CauseOfTranLen-m_CommAddrLen-m_MsgAddrLen) / 5;  // SQ = 1
  899.    nYMNumToSend  = pDoc->m_YMNum - (m_SYMAddrToSend - pDoc->m_YMAddr);
  900.    
  901.    BYTE b1;   //请求发送标志,如果是最后一帧,置0
  902.    if (nYMNumToSend > nMaxNumToSend)
  903.    { 
  904.    nYMNumToSend = nMaxNumToSend;
  905.    b1 = 0x02;
  906.    }
  907.    else
  908.    {
  909.    IsFullSended   = true;              //本帧能全部发送脉冲
  910.    b1 = 0x00;
  911.    }
  912.    m_SSendByte[0] = 0x68;
  913.    m_SSendByte[1] = nYMNumToSend*5+2+1+1+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen;  // 按SQ =1
  914.    m_SSendByte[2] = m_SSendByte[1];
  915.    m_SSendByte[3] = 0x68;
  916.    m_SSendByte[4] = 0x80  + 0x08 + b1;   //功能码
  917.    m_SSendByte[5] = m_Addr;
  918.    m_SSendByte[6] = 0x0f;                  //类型标识 15 
  919.    m_SSendByte[7] = 0x80 + nYMNumToSend;   //SQ=1
  920.    if ((m_SRecByte[m_SRecByte[1]+3] & 0x07) < 0x04)   //计数量召唤命令限定词(QCC)->RQT  仅取低3位
  921.    m_SSendByte[8] = 37 + (m_SRecByte[m_SRecByte[1]+3] & 0x07);   //传送原因:响应第i组召唤
  922.    else 
  923.        m_SSendByte[8] = 37;         //传送原因:响应计量总召唤
  924.    m_SSendByte[9] = m_Addr;                //如与实际字节数不符,后面仍能覆盖
  925.    m_SSendByte[8+m_CauseOfTranLen]   = m_Addr;   //公共地址
  926.    m_SSendByte[8+m_CauseOfTranLen+1] = m_Addr;   //如与实际字节数不符,后面仍能覆盖
  927.    WORD temVar = 0x0000;
  928.    temVar = (WORD)m_SYCAddrToSend;      //信息体地址
  929.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen]   = LOBYTE(temVar);
  930.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+1] = HIBYTE(temVar);    //如与实际字节数不符,后面仍能覆盖
  931.    m_SSendByte[8+m_CauseOfTranLen+m_CommAddrLen+2] = 0x00;
  932.    
  933.    int i,j;
  934.    j = 8+m_CauseOfTranLen+m_CommAddrLen+m_MsgAddrLen;    
  935.    for (i=0; i<nYMNumToSend; i++)
  936.    {
  937.        temVar = LOWORD(pDoc->m_pYMData[m_SYMAddrToSend-pDoc->m_YMAddr+i]);  //低2字节
  938.    m_SSendByte[j+i*5]   = LOBYTE(temVar);
  939.    m_SSendByte[j+i*5+1] = HIBYTE(temVar);
  940.        temVar = HIWORD(pDoc->m_pYMData[m_SYMAddrToSend-pDoc->m_YMAddr+i]);  //高2字节
  941.        m_SSendByte[j+i*5+2] = LOBYTE(temVar);
  942.    m_SSendByte[j+i*5+3] = HIBYTE(temVar);
  943.        m_SSendByte[j+i*5+4] = i;
  944.    }
  945.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);
  946.    m_SSendByte[5+m_SSendByte[1]] = 0x16;
  947.    /////////////////////////////////////////////////////////
  948.    if (IsFullSended)
  949.        m_SYMAddrToSend = pDoc->m_YMAddr;
  950.    else
  951.    m_SYMAddrToSend = m_SYMAddrToSend + nYMNumToSend;
  952. }
  953. //应答主站召记数量(确认应答)
  954. void CPrtIEC101::SPack_C_CI_ACK()
  955. {
  956.    for (int i=0; i<m_SRecByte[1]+6; i++)
  957.    m_SSendByte[i] = m_SRecByte[i];
  958.        
  959.    m_SSendByte[4] = 0x80 + 0x20;   //传输方向+ACD标志
  960.    m_SSendByte[8] = 0x07;          //传送原因
  961.    
  962.    m_SSendByte[4+m_SSendByte[1]] = GetAddByte(m_SSendByte,m_SSendByte[1],4);     //和校验
  963. }