source: trunk/XSUC/ModbucfgView.cpp @ 25

Last change on this file since 25 was 11, checked in by marrucho, 11 years ago
File size: 37.5 KB
Line 
1// ModbucfgView.cpp : implementation of the CModbucfgView class
2//
3
4#include "stdafx.h"
5#include "Modbucfg.h"
6
7#include "ModbucfgDoc.h"
8#include "ModbucfgView.h"
9#include ".\modbucfgview.h"
10
11
12#ifdef _DEBUG
13#define new DEBUG_NEW
14#undef THIS_FILE
15static char THIS_FILE[] = __FILE__;
16#endif
17
18/////////////////////////////////////////////////////////////////////////////
19// CModbucfgView
20
21IMPLEMENT_DYNCREATE(CModbucfgView, CFormView)
22
23BEGIN_MESSAGE_MAP(CModbucfgView, CFormView)
24        //{{AFX_MSG_MAP(CModbucfgView)
25        ON_BN_CLICKED(IDC_CHK_Enable_Poll, OnchkEnablePoll)
26        ON_EN_CHANGE(IDC_EDIT_INTERVAL, OnChangeEditInterval)
27        ON_BN_CLICKED(IDC_CMD_WRITE, OnCmdWrite)
28        //}}AFX_MSG_MAP
29        ON_CBN_SELCHANGE(IDC_CBO_READ_FUNCTION, OnCbnSelchangeCboReadFunction)
30        ON_CBN_SELCHANGE(IDC_CBO_WRITE_FUNCTION, OnCbnSelchangeCboWriteFunction)
31        ON_COMMAND(ID_APP_MEM_MAP, OnAppMemMap)
32        ON_EN_CHANGE(IDC_EDIT_QUANT, OnEnChangeEditQuant)
33        ON_EN_CHANGE(IDC_EDIT_ADDR, OnEnChangeEditAddr)
34        ON_EN_CHANGE(IDC_EDIT_QUANT_2, OnEnChangeEditQuant2)
35        ON_LBN_SELCHANGE(IDC_LIST5, OnLbnSelchangeList5)
36        ON_LBN_SELCHANGE(IDC_LST_VALUES, OnLbnSelchangeLstValues)
37        ON_EN_CHANGE(IDC_EDIT_ADDR_WRI, OnEnChangeEditAddrWri)
38        ON_EN_CHANGE(IDC_EDIT_VALUE, OnEnChangeEditValue)
39        ON_WM_VSCROLL()
40        ON_BN_CLICKED(IDC_CMD_READ, OnCmdRead)
41        ON_EN_CHANGE(IDC_EDIT16, OnEnChangeEdit16)
42        ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
43        ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
44END_MESSAGE_MAP()
45
46/////////////////////////////////////////////////////////////////////////////
47// CModbucfgView construction/destruction
48
49CModbucfgView::CModbucfgView()
50        : CFormView(CModbucfgView::IDD)
51/*      , m_edtQuant2(false)
52        , m_edtQuant2(_T(""))*/
53        , m_spinIndex(0)
54{
55        //{{AFX_DATA_INIT(CModbucfgView)
56        //}}AFX_DATA_INIT
57        // TODO: add construction code here
58
59}
60
61CModbucfgView::~CModbucfgView()
62{
63}
64
65void CModbucfgView::DoDataExchange(CDataExchange* pDX)
66{
67        CFormView::DoDataExchange(pDX);
68        //{{AFX_DATA_MAP(CModbucfgView)
69        DDX_Control(pDX, IDC_CBO_DATA_TYPE, m_cboDataType);
70        DDX_Control(pDX, IDC_EDIT_INTERVAL, m_edtInterval);
71        DDX_Control(pDX, IDC_CHK_Enable_Poll, m_butPollEnable);
72        DDX_Control(pDX, IDC_STAT_STATUS, m_statStatus);
73        DDX_Control(pDX, IDC_STAT_ERROR, m_staError);
74        DDX_Control(pDX, IDC_LST_VALUES, m_lstValues);
75        DDX_Control(pDX, IDC_CBO_WRITE_FUNCTION, m_cboWriteFunctions);
76        DDX_Control(pDX, IDC_CBO_READ_FUNCTION, m_cboReadFunctions);
77        DDX_Control(pDX, IDC_CBO_CONNECTION, m_cboConnections);
78        DDX_Control(pDX, IDC_EDIT_VALUE, m_edtValue);
79        DDX_Control(pDX, IDC_EDIT_QUANT, m_edtQuant);
80        DDX_Control(pDX, IDC_EDIT_DEVICE, m_edtDevice);
81        DDX_Control(pDX, IDC_EDIT_ADDR_WRI, m_edtWriteAddr);
82        DDX_Control(pDX, IDC_EDIT_ADDR, m_edtReadAddr);
83        DDX_Control(pDX, IDC_CMD_WRITE, m_cmdWrite);
84        //}}AFX_DATA_MAP
85        DDX_Control(pDX, IDC_EDIT_QUANT_2, m_edtQuant2);
86        //      DDX_Control(pDX, IDC_LIST5, m_list5Values);
87        DDX_Control(pDX, IDC_EDIT6, m_edtIndex);
88        DDX_Text(pDX, IDC_EDIT6, m_spinIndex);
89        DDX_Control(pDX, IDC_EDIT3, m_readEil);
90        DDX_Control(pDX, IDC_EDIT5, m_readSVd);
91        DDX_Control(pDX, IDC_EDIT7, m_readSVfin);
92        DDX_Control(pDX, IDC_EDIT8, m_readSV1);
93        DDX_Control(pDX, IDC_EDIT9, m_readSV2);
94        DDX_Control(pDX, IDC_EDIT10, m_readdtp);
95        DDX_Control(pDX, IDC_EDIT11, m_readdt);
96        DDX_Control(pDX, IDC_EDIT12, m_readdP);
97        DDX_Control(pDX, IDC_EDIT13, m_readdPsecu);
98        DDX_Control(pDX, IDC_EDIT14, m_readSVil);
99        DDX_Control(pDX, IDC_EDIT15, m_readSleil);
100        DDX_Control(pDX, IDC_EDIT16, m_readSTc);
101        DDX_Control(pDX, IDC_EDIT17, m_readNbal_max);
102        DDX_Control(pDX, IDC_EDIT18, m_readFr);
103        DDX_Control(pDX, IDC_EDIT19, m_readN_cur);
104        DDX_Control(pDX, IDC_CMD_READ, m_cmdRead);
105        DDX_Control(pDX, IDC_EDIT4, m_readNil);
106        DDX_Control(pDX, IDC_EDIT20, m_readNil_stat);
107        DDX_Control(pDX, IDC_EDIT21, m_readP_last);
108        DDX_Control(pDX, IDC_EDIT22, m_readN_last);
109        DDX_Control(pDX, IDC_EDIT23, m_readdPil);
110        DDX_Control(pDX, IDC_EDIT24, m_readV_cur);
111        DDX_Control(pDX, IDC_EDIT25, m_readPic);
112        DDX_Control(pDX, IDC_EDIT26, m_readTimer);
113        DDX_Control(pDX, IDC_EDIT27, m_readNbal);
114        DDX_Control(pDX, IDC_EDIT28, m_readP_cde);
115        DDX_Control(pDX, IDC_EDIT29, m_readPp);
116        DDX_Control(pDX, IDC_EDIT30, m_readStat_C_1);
117        DDX_Control(pDX, IDC_EDIT31, m_readStat_C_2);
118        DDX_Control(pDX, IDC_EDIT32, m_readStat_C_3);
119        DDX_Control(pDX, IDC_EDIT33, m_readStat_C_4);
120        DDX_Control(pDX, IDC_EDIT34, m_readStat_C_5);
121        DDX_Control(pDX, IDC_EDIT35, m_readStat_C_6);
122        DDX_Control(pDX, IDC_EDIT36, m_readStat_C_7);
123        DDX_Control(pDX, IDC_EDIT37, m_readStat_C_8);
124        DDX_Control(pDX, IDC_EDIT38, m_readNum_C1a);
125        DDX_Control(pDX, IDC_EDIT39, m_readNum_C1b);
126        DDX_Control(pDX, IDC_EDIT40, m_readNum_C2a);
127        DDX_Control(pDX, IDC_EDIT41, m_readNum_C2b);
128        DDX_Control(pDX, IDC_EDIT42, m_readNum_C3a);
129        DDX_Control(pDX, IDC_EDIT43, m_readNum_C3b);
130        DDX_Control(pDX, IDC_EDIT44, m_readNum_C4a);
131        DDX_Control(pDX, IDC_EDIT45, m_readNum_C4b);
132        DDX_Control(pDX, IDC_EDIT54, m_readN_Seqcond);
133        DDX_Control(pDX, IDC_EDIT57, m_readMAP);
134        DDX_Control(pDX, IDC_EDIT46, m_readTemp_cond_1);
135        DDX_Control(pDX, IDC_EDIT47, m_readTemp_cond_2);
136        DDX_Control(pDX, IDC_EDIT48, m_readTemp_cond_3);
137        DDX_Control(pDX, IDC_EDIT49, m_readTemp_cond_4);
138        DDX_Control(pDX, IDC_EDIT50, m_readTemp_cond_5);
139        DDX_Control(pDX, IDC_EDIT51, m_readTemp_cond_6);
140        DDX_Control(pDX, IDC_EDIT52, m_readTemp_cond_7);
141        DDX_Control(pDX, IDC_EDIT53, m_readTemp_cond_8);
142        DDX_Control(pDX, IDC_EDIT58, m_readStat_C_9);
143        DDX_Control(pDX, IDC_EDIT59, m_readStat_C_10);
144        DDX_Control(pDX, IDC_EDIT60, m_readStat_C_11);
145        DDX_Control(pDX, IDC_EDIT61, m_readStat_C_12);
146        DDX_Control(pDX, IDC_EDIT62, m_readTemp_cond_9);
147        DDX_Control(pDX, IDC_EDIT63, m_readTemp_cond_10);
148        DDX_Control(pDX, IDC_EDIT64, m_readTemp_cond_11);
149        DDX_Control(pDX, IDC_EDIT65, m_readTemp_cond_12);
150}
151
152BOOL CModbucfgView::PreCreateWindow(CREATESTRUCT& cs)
153{
154        // TODO: Modify the Window class or styles here by modifying
155        //  the CREATESTRUCT cs
156
157        return CFormView::PreCreateWindow(cs);
158}
159
160/////////////////////////////////////////////////////////////////////////////
161// CModbucfgView diagnostics
162
163#ifdef _DEBUG
164void CModbucfgView::AssertValid() const
165{
166        CFormView::AssertValid();
167}
168
169void CModbucfgView::Dump(CDumpContext& dc) const
170{
171        CFormView::Dump(dc);
172}
173
174CModbucfgDoc* CModbucfgView::GetDocument() // non-debug version is inline
175{
176        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CModbucfgDoc)));
177        return (CModbucfgDoc*)m_pDocument;
178}
179#endif //_DEBUG
180
181/////////////////////////////////////////////////////////////////////////////
182// CModbucfgView message handlers
183
184void CModbucfgView::OnInitialUpdate() 
185{
186        CFormView::OnInitialUpdate();
187       
188        // TODO: Add your specialized code here and/or call the base class
189        LoadControls();
190
191        //Dans le cas d'une CFormView, les ascenseurs apparaissent automatiquement dès que
192        //la surface cliente de la fenêtre devient trop petite par rapport à la surface réelle.
193        //pour ne pas avoir à gérer les ascenseurs, je les supprime: une CFormView hérite de la classe CSCrollView
194        //qui dispose de la fonction SetScaleToFitSize pour adapter la surface de la fenêtre à la taille fenêtrée
195        CRect Rect;
196    GetParentFrame()->GetWindowRect(&Rect);
197    SIZE size;
198    size.cx=Rect.Width();
199    size.cy=Rect.Height();
200    SetScaleToFitSize(size);
201
202        //controle spin
203        CSpinButtonCtrl* pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2);
204        pSpin->SetRange(0,100);//plage du control : 0-100
205        pSpin->SetPos((int)m_spinIndex * 1);//valeur initiale 1
206
207        //tableaux pour les write multiple
208        m_bValueMultiple.SetSize(100);
209        m_sValueMultiple.SetSize(100);
210        m_wValueMultiple.SetSize(100);
211        m_fValueMultiple.SetSize(100);
212        m_dValueMultiple.SetSize(100);
213
214}
215
216void CModbucfgView::LoadControls()
217{
218        CString str;
219        CString sKey;
220        CConnection* pConnection;
221        POSITION pos;
222
223        //Read functions
224        m_cboReadFunctions.AddString(CString("LoopbackTest"));
225        m_cboReadFunctions.AddString(CString("Holding Registers"));
226        m_cboReadFunctions.AddString(CString("Input Registers"));
227        m_cboReadFunctions.AddString(CString("Coil Status"));
228        m_cboReadFunctions.AddString(CString("Discrete Inputs"));
229        m_cboReadFunctions.SetCurSel(1);
230       
231        //Write Functions
232        m_cboWriteFunctions.AddString(CString("Single Register"));
233        m_cboWriteFunctions.AddString(CString("Single Coil"));
234        m_cboWriteFunctions.AddString(CString("Multiple Registers"));
235        m_cboWriteFunctions.AddString(CString("Multiple Coils"));
236        m_cboWriteFunctions.SetCurSel(0);
237
238
239        pos = gConnections.GetStartPosition();
240       
241        m_cboConnections.ResetContent();
242
243        while (NULL!=pos) {
244                gConnections.GetNextAssoc(pos,sKey,pConnection);
245                m_cboConnections.AddString(sKey);
246        }
247
248        m_cboConnections.SetCurSel(0);
249
250
251        //Default Values
252        str=_T("1");
253    m_edtDevice.SetWindowText(str);
254       
255        str=_T("0");
256        m_edtValue.SetWindowText(str);
257        m_edtWriteAddr.SetWindowText(str);
258        m_edtReadAddr.SetWindowText(str);
259
260        str=_T("10");
261        m_edtQuant.SetWindowText(str);
262
263        str=_T("1000");
264        m_edtInterval.SetWindowText(str);
265
266        str=_T("10");
267        m_edtQuant2.SetWindowText(str);
268
269        //Data Type
270        m_cboDataType.AddString(CString("char"));
271        m_cboDataType.AddString(CString("signed - 16"));
272        m_cboDataType.AddString(CString("unsigned - 16"));
273        m_cboDataType.AddString(CString("float - 32"));
274        m_cboDataType.AddString(CString("float - 32 reverse"));
275        m_cboDataType.AddString(CString("double - 64"));
276        m_cboDataType.AddString(CString("double - 64 reverse"));
277        m_cboDataType.SetCurSel(1);
278
279        //associe la variable m_readVacuum à la ressource IDC_LIST2
280        m_readVacuum = (CListCtrl*)GetDlgItem (IDC_LIST2);
281        //
282        m_readVacuum->SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);
283        //ajout des titres
284        m_readVacuum->InsertColumn(0,_T("Name"),LVCFMT_CENTER,50);
285        m_readVacuum->InsertColumn(1,_T("value(mbar)"),LVCFMT_CENTER,100);
286        m_readVacuum->SetBkColor(RGB(202,202,255));
287        //nb de lignes
288//      m_readVacuum->SetItemCount(12);
289        //init tableau
290        for (int i=0;i < 12;i++)
291        {
292                str.Format(TEXT("V%d"), i+1);
293                // Insert the item, select every other item.
294                m_readVacuum->InsertItem(LVIF_TEXT|LVIF_STATE, i, str, 
295      (i%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED,0, 0);
296                m_readVacuum->SetItemText(i,1,"0");
297        }
298
299        //associe la variable m_readCondParam à la ressource IDC_LIST3
300        m_readCondParam = (CListCtrl*)GetDlgItem (IDC_LIST3);
301        //
302        m_readCondParam->SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);
303        //ajout des titres
304        m_readCondParam->InsertColumn(0,_T("step number"),LVCFMT_CENTER,40);
305        m_readCondParam->InsertColumn(1,_T("Pi_min"),LVCFMT_CENTER,50);
306        m_readCondParam->InsertColumn(1,_T("Pi_max"),LVCFMT_CENTER,50);
307        m_readCondParam->InsertColumn(1,_T("Tn_max"),LVCFMT_CENTER,50);
308        m_readCondParam->InsertColumn(1,_T("Tp_max"),LVCFMT_CENTER,50);
309        m_readCondParam->InsertColumn(1,_T("Ln(us)"),LVCFMT_CENTER,50);
310        //init tableau
311        for (int i=0;i < 12;i++)
312        {
313                str.Format(TEXT("%d"), i+1);
314                // Insert the item, select every other item.
315                m_readCondParam->InsertItem(LVIF_TEXT|LVIF_STATE, i, str, 
316      (i%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED,0, 0);
317        }
318}
319
320void CModbucfgView::StartWork()
321{
322        SCODE sc = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);
323        //SCODE sc = ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
324
325        if (FAILED(sc))
326        {
327                // warn about non-NULL success codes
328                TRACE1("Warning: OleInitialize returned scode = %x",sc);
329        }
330
331        m_dwCount=0;
332        m_dwSum=0;
333        m_dwErrors=0;
334}
335
336void CModbucfgView::DoWork()
337{
338        ldiv_t div_result;
339    float fUpdateSpeed;
340        DWORD dwTime;
341        CString str;
342        WORD nError;
343        static int iFunction=0;
344   
345        int iNumLoops=10;
346       
347       
348        fUpdateSpeed=0.0;
349       
350        if ((m_cboReadFunctions.GetCurSel()>=LOOP_BACK_TEST)&&
351                (m_cboReadFunctions.GetCurSel()<=READ_INPUT_STATUS)){
352               
353                m_dwCount++;
354//              nError=ExecuteReadFunction(m_cboReadFunctions.GetCurSel(),dwTime,str);
355                nError=ExecuteReadFunction(iFunction++,dwTime,str);
356                if (iFunction==6)iFunction=0;
357                m_dwSum +=dwTime; 
358               
359                div_result = ldiv(m_dwCount,iNumLoops);
360               
361                if (CModbus::ERR_OK!=nError){
362                        m_dwErrors++;
363                }
364               
365                if (0==div_result.rem){
366                        fUpdateSpeed=(float)(iNumLoops*1000)/(float)m_dwSum;
367                        m_dwSum=0; 
368                }
369                else {
370                        fUpdateSpeed=(float)(1*1000)/(float)dwTime;
371                }
372
373                m_staError.SetWindowText(str);
374                str.Format("%d Errors=%d  %4.2f(Up./s) ",m_dwCount,m_dwErrors,fUpdateSpeed); 
375                m_statStatus.SetWindowText(str);
376        }
377       
378                       
379}
380
381void CModbucfgView::EndWork()
382{
383        ::CoUninitialize();
384}
385
386void CModbucfgView::OnchkEnablePoll() 
387{
388        CString sText;
389        DWORD dwInterval=0;
390
391        m_edtInterval.GetWindowText(sText);
392        dwInterval=DWORD(atol(sText));
393       
394//      if (dwInterval>10000) {
395        if ((dwInterval>10000) || (dwInterval<200)) {
396                AfxMessageBox("Max. is 10000 ms and Min. is 200 ms");
397                dwInterval=10000;
398                sText.Format("%d",dwInterval);
399                m_edtInterval.SetWindowText(sText);
400                return;
401        }
402
403        if (0!=m_butPollEnable.GetCheck()) {
404                if (!IsBusy()) {
405                        CreateThread(0,0,NULL,dwInterval);
406                }
407                m_butPollEnable.SetCheck(1);
408        }
409        else {
410                Stop();
411        }
412}
413
414
415WORD CModbucfgView::ExecuteReadFunction(int iFunction,DWORD& dwTime, CString& rErrorMessage)
416{
417        CModbus* pModbus;
418        CShortArray aValues;
419        CByteArray abCoilValues;
420       
421        CFloatArray afValues;
422        CDblArray adValues;
423
424    CString str;
425        CString sAux;
426    WORD nError;
427        int i;
428        BOOL bRegisters;
429        DWORD dwStart;
430        CString sKey;
431        CConnection* pConnection =NULL;
432        BYTE byDevice;
433        WORD wQuant;
434        WORD wAddr;
435        int nIndex;
436        int nPreviusCount;
437        int iDataType;
438
439        CListCtrl* vacuum = (CListCtrl*)GetDlgItem (IDC_LIST2);
440        CListCtrl* parameters = (CListCtrl*)GetDlgItem (IDC_LIST3);
441
442        i=m_cboConnections.GetCurSel();
443        if (i<0) {
444                return 0;
445        }
446        else {
447                m_cboConnections.GetLBText(i,sKey);
448               
449                if (gConnections.Lookup(sKey,pConnection)) {
450               
451                        pModbus=pConnection->m_pModbus;
452                }
453                else {
454                        ASSERT(FALSE);
455                        return 0;
456                }
457        }
458
459        m_edtDevice.GetWindowText(str);
460        byDevice=BYTE(atoi(str));
461
462        switch (iFunction)
463        {
464        case 0:
465        //coils : case READ_OUTPUT_STATUS
466        wQuant=13;
467        abCoilValues.SetSize(wQuant);
468        wAddr=3000;
469        nError=pModbus->ReadOutputStatus(byDevice,wAddr,wQuant, abCoilValues);
470
471        str.Format("%d",abCoilValues[0]);
472        m_readEil.SetWindowText(str);
473        str.Format("%d",abCoilValues[1]);
474        m_readStat_C_1.SetWindowText(str);             
475        str.Format("%d",abCoilValues[2]);
476        m_readStat_C_2.SetWindowText(str);             
477        str.Format("%d",abCoilValues[3]);
478        m_readStat_C_3.SetWindowText(str);             
479        str.Format("%d",abCoilValues[4]);
480        m_readStat_C_4.SetWindowText(str);             
481        str.Format("%d",abCoilValues[5]);
482        m_readStat_C_5.SetWindowText(str);             
483        str.Format("%d",abCoilValues[6]);
484        m_readStat_C_6.SetWindowText(str);             
485        str.Format("%d",abCoilValues[7]);
486        m_readStat_C_7.SetWindowText(str);             
487        str.Format("%d",abCoilValues[8]);
488        m_readStat_C_8.SetWindowText(str);             
489        str.Format("%d",abCoilValues[9]);
490        m_readStat_C_9.SetWindowText(str);             
491        str.Format("%d",abCoilValues[10]);
492        m_readStat_C_10.SetWindowText(str);             
493        str.Format("%d",abCoilValues[11]);
494        m_readStat_C_11.SetWindowText(str);             
495        str.Format("%d",abCoilValues[12]);
496        m_readStat_C_12.SetWindowText(str);             
497        break;
498
499        case 1:
500        //holdings : case READ_OUTPUT_REGISTERS:               
501//      iDataType = DATA_UNSIGNED_16;
502        wQuant=125;
503        aValues.SetSize(wQuant);
504        wAddr=2000;
505        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, aValues);
506
507        str.Format("%d",aValues[0]);
508        m_readSVd.SetWindowText(str);           
509        str.Format("%d",aValues[1]);
510        m_readSVfin.SetWindowText(str);         
511        str.Format("%d",aValues[2]);
512        m_readSV1.SetWindowText(str);           
513        str.Format("%d",aValues[3]);
514        m_readSV2.SetWindowText(str);           
515        str.Format("%d",aValues[4]);
516        m_readdtp.SetWindowText(str);           
517        str.Format("%d",aValues[5]);
518        m_readdt.SetWindowText(str);
519        str.Format("%d",aValues[20]);
520        m_readSVil.SetWindowText(str);         
521        str.Format("%d",aValues[25]);
522        m_readNbal_max.SetWindowText(str);             
523        str.Format("%d",aValues[26]);
524        m_readFr.SetWindowText(str);           
525        str.Format("%d",aValues[27]);
526        m_readN_cur.SetWindowText(str);         
527        str.Format("%d",aValues[30]);
528        m_readNil.SetWindowText(str);           
529        str.Format("%d",aValues[31]);
530        m_readNil_stat.SetWindowText(str);             
531        str.Format("%d",aValues[34]);
532        m_readN_last.SetWindowText(str);               
533        str.Format("%d",aValues[37]);
534        m_readV_cur.SetWindowText(str);         
535        str.Format("%d",(aValues[40]<<16)+aValues[41]);//2 mots de 16 bits
536        m_readTimer.SetWindowText(str);         
537        str.Format("%d",aValues[42]);
538        m_readNbal.SetWindowText(str);         
539        str.Format("%d",aValues[47]);
540        m_readN_Seqcond.SetWindowText(str);             
541        str.Format("%d",aValues[48]);
542        m_readMAP.SetWindowText(str);           
543        str.Format("%d",aValues[50]);
544        m_readNum_C1a.SetWindowText(str);               
545        str.Format("%d",aValues[51]);
546        m_readNum_C1b.SetWindowText(str);               
547        str.Format("%d",aValues[52]);
548        m_readNum_C2a.SetWindowText(str);               
549        str.Format("%d",aValues[53]);
550        m_readNum_C2b.SetWindowText(str);               
551        str.Format("%d",aValues[54]);
552        m_readNum_C3a.SetWindowText(str);               
553        str.Format("%d",aValues[55]);
554        m_readNum_C3b.SetWindowText(str);               
555        str.Format("%d",aValues[56]);
556        m_readNum_C4a.SetWindowText(str);               
557        str.Format("%d",aValues[57]);
558        m_readNum_C4b.SetWindowText(str);               
559        str.Format("%d",(aValues[58]<<16)+aValues[59]);//2 mots de 16 bits
560        m_readTemp_cond_1.SetWindowText(str);           
561        str.Format("%d",(aValues[60]<<16)+aValues[61]);//2 mots de 16 bits
562        m_readTemp_cond_2.SetWindowText(str);           
563        str.Format("%d",(aValues[62]<<16)+aValues[63]);//2 mots de 16 bits
564        m_readTemp_cond_3.SetWindowText(str);           
565        str.Format("%d",(aValues[64]<<16)+aValues[65]);//2 mots de 16 bits
566        m_readTemp_cond_4.SetWindowText(str);           
567        str.Format("%d",(aValues[66]<<16)+aValues[67]);//2 mots de 16 bits
568        m_readTemp_cond_5.SetWindowText(str);           
569        str.Format("%d",(aValues[68]<<16)+aValues[69]);//2 mots de 16 bits
570        m_readTemp_cond_6.SetWindowText(str);           
571        str.Format("%d",(aValues[70]<<16)+aValues[71]);//2 mots de 16 bits
572        m_readTemp_cond_7.SetWindowText(str);           
573        str.Format("%d",(aValues[72]<<16)+aValues[73]);//2 mots de 16 bits
574        m_readTemp_cond_8.SetWindowText(str);           
575        str.Format("%d",(aValues[74]<<16)+aValues[75]);//2 mots de 16 bits
576        m_readTemp_cond_9.SetWindowText(str);           
577        str.Format("%d",(aValues[76]<<16)+aValues[77]);//2 mots de 16 bits
578        m_readTemp_cond_10.SetWindowText(str);         
579        str.Format("%d",(aValues[78]<<16)+aValues[79]);//2 mots de 16 bits
580        m_readTemp_cond_11.SetWindowText(str);         
581        str.Format("%d",(aValues[80]<<16)+aValues[81]);//2 mots de 16 bits
582        m_readTemp_cond_12.SetWindowText(str);         
583        break;
584
585        case 2:
586        //holdings : case READ_OUTPUT_REGISTERS:               
587//      iDataType = DATA_FLOAT;
588        wQuant=17;
589        afValues.SetSize(wQuant);
590        wAddr=2006;
591        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, afValues);
592
593        str.Format("%g",afValues[0]);
594        m_readdP.SetWindowText(str);           
595        str.Format("%g",afValues[1]);
596        m_readdPsecu.SetWindowText(str);
597        str.Format("%g",afValues[13]);
598        m_readP_last.SetWindowText(str);
599        str.Format("%g",afValues[16]);
600        m_readPic.SetWindowText(str);
601        break;
602
603        case 3:
604        //holdings : case READ_OUTPUT_REGISTERS:               
605//      iDataType = DATA_FLOAT;
606        wQuant=24;
607        afValues.SetSize(wQuant);
608        wAddr=2021;
609        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, afValues);
610
611        str.Format("%g",afValues[0]);
612        m_readSleil.SetWindowText(str);
613        str.Format("%g",afValues[1]);
614        m_readSTc.SetWindowText(str);
615        str.Format("%g",afValues[7]);
616        m_readdPil.SetWindowText(str);
617        str.Format("%g",afValues[11]);
618        m_readP_cde.SetWindowText(str);
619        str.Format("%g",afValues[12]);
620        m_readPp.SetWindowText(str);
621        break;
622
623        case 4:
624        //holdings : case READ_OUTPUT_REGISTERS:               
625//      iDataType = DATA_FLOAT;
626        wQuant=24;
627        afValues.SetSize(wQuant);
628        wAddr=/*2108*/2116;
629        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, afValues);
630
631        //Pi_max
632        for (int i=0;i < 12;i++)
633        {
634                str.Format("%g",afValues[i]);
635                parameters->SetItemText(i,4,str);
636        }
637        //Pi_min
638        for (int i=12;i < 24;i++)
639        {
640                str.Format("%g",afValues[i]);
641                parameters->SetItemText(i-12,5,str);
642        }
643        break;
644
645        case 5:
646        //holdings : case READ_OUTPUT_REGISTERS:               
647//      iDataType = DATA_UNSIGNED_16;
648        wQuant=125;
649        aValues.SetSize(wQuant);
650        wAddr=2080;
651        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, aValues);
652        //Ln
653        for (int i=0;i < 12;i++)
654        {
655                str.Format("%d",aValues[i]);
656                parameters->SetItemText(i,1,str);
657        }
658        //Tn_max
659        for (int i=12;i < 24;i++)
660        {
661                str.Format("%d",aValues[i]);
662                parameters->SetItemText(i-12,3,str);
663        }
664        //Tp_max : 12 mots de 16 bits ????
665        for (int i=24;i < 36;i++)
666        {
667                str.Format("%d",aValues[i]);
668                parameters->SetItemText(i-24,2,str);
669        }
670        //vacuum
671        for (int i=90;i < 102;i++)
672        {
673                str.Format("%d",aValues[i]);
674                vacuum->SetItemText(i-90,1,str);
675        }
676        break;
677        }
678
679        rErrorMessage=pModbus->ErrorMessage(nError);
680        return nError;
681}
682
683void CModbucfgView::OnChangeEditInterval() 
684{
685
686        CString sText;
687        DWORD dwInterval=0;
688
689        m_edtInterval.GetWindowText(sText);
690        dwInterval=DWORD(atol(sText));
691
692//      if (dwInterval>10000) {
693//              AfxMessageBox("Max. Interval is 10000 ms");
694        if ((dwInterval>10000) || (dwInterval<200)) {
695                AfxMessageBox("Max. is 10000 ms and Min. is 200 ms");
696                dwInterval=10000;
697                sText.Format("%d",dwInterval);
698                m_edtInterval.SetWindowText(sText);
699                return;
700        }
701
702        SetCycleTime(int(dwInterval)); 
703}
704
705void CModbucfgView::OnCmdWrite() 
706{
707        BYTE byDevice=0;
708        WORD wValue=0;
709        WORD wAddr=0;
710        CModbus* pModbus=GetConnection();
711        WORD nError=CModbus::ERR_OK;
712        CString strValue;
713        CString sVal;
714        CWaitCursor WaitCursor;
715        double dValue=0.0;
716
717        WORD wQuant, wIndex;
718
719        if (NULL==pModbus) {
720                return;
721        }
722
723        m_edtValue.GetWindowText(strValue);
724        sVal= strValue;
725        wValue = (WORD)atoi(strValue);
726
727        m_edtDevice.GetWindowText(strValue);
728        byDevice = (BYTE)atoi(strValue);
729
730        m_edtWriteAddr.GetWindowText(strValue);
731        wAddr = (WORD)atoi(strValue);
732
733        m_edtQuant2.GetWindowText(strValue);
734        wQuant=(BYTE)(atoi(strValue));
735
736        m_edtIndex.GetWindowText(strValue);
737        wIndex=(BYTE)(atoi(strValue));
738
739        switch (m_cboWriteFunctions.GetCurSel()) {
740               
741        case PRESET_SINGLE_REGISTER:
742
743                switch(m_cboDataType.GetCurSel()) {
744                       
745                case DATA_CHAR:
746                        sVal.TrimLeft();
747                        if (sVal.GetLength()>0) { 
748                                nError=pModbus->PresetSingleRegister(byDevice,wAddr,WORD(sVal[0]));
749                        }
750                        break;
751                case DATA_SIGNED_16:                   
752                case DATA_UNSIGNED_16:
753                        if (sVal.GetLength()>0) { 
754                                nError=pModbus->PresetSingleRegister(byDevice,wAddr,WORD(atoi(sVal)));
755                        }
756                        break;
757                case DATA_FLOAT:
758                        nError=pModbus->PresetSingleRegister(byDevice,wAddr,float(atof(sVal)));
759                        break;
760                case DATA_FLOAT_REVERSE:
761                        nError=pModbus->PresetSingleRegister(byDevice,wAddr,float(atof(sVal)),CModbus::REAL_REVERSE);
762                        break;
763                case DATA_DOUBLE:
764                        nError=pModbus->PresetSingleRegister(byDevice,wAddr,double(atof(sVal)));
765               
766                        break;
767                case DATA_DOUBLE_REVERSE:
768                        nError=pModbus->PresetSingleRegister(byDevice,wAddr,double(atof(sVal)),CModbus::REAL_REVERSE);
769                        break;
770                }
771                if(nError!=CModbus::ERR_OK){
772                        WaitCursor.Restore();
773                        AfxMessageBox(pModbus->ErrorMessage(nError));
774                }
775                break;
776
777        case FORCE_SINGLE_COIL:
778                nError=pModbus->ForceSingleCoil(byDevice,wAddr,(BOOL)wValue);
779                if(nError!=CModbus::ERR_OK){
780                        WaitCursor.Restore(); 
781                        AfxMessageBox(pModbus->ErrorMessage(nError));
782                }
783                break;
784
785        case WRITE_MULTIPLE_REGISTERS:
786                {
787                //controle spin
788                CSpinButtonCtrl* pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2);
789
790                switch(m_cboDataType.GetCurSel()) {                     
791                case DATA_CHAR:
792                        sVal.TrimLeft();
793                        if (sVal.GetLength()>0) { 
794                                m_sValueMultiple.SetAt(wIndex,wValue);
795                                nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_sValueMultiple);
796                        }
797                        break;
798                case DATA_SIGNED_16:
799                case DATA_UNSIGNED_16:
800                        if (sVal.GetLength()>0) { 
801                                m_wValueMultiple.SetAt(wIndex,wValue);
802                                nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_wValueMultiple);
803                        }
804                        break;
805                case DATA_FLOAT:
806                        m_fValueMultiple.SetAt(wIndex,wValue);
807                        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_fValueMultiple);
808                        break;
809                case DATA_FLOAT_REVERSE:
810                        m_fValueMultiple.SetAt(wIndex,wValue);
811                        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_fValueMultiple,CModbus::REAL_REVERSE);
812                        break;
813                case DATA_DOUBLE:
814                        m_dValueMultiple.SetAt(wIndex,wValue);
815                        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_dValueMultiple);
816                        break;
817                case DATA_DOUBLE_REVERSE:
818                        m_dValueMultiple.SetAt(wIndex,wValue);
819                        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_dValueMultiple,CModbus::REAL_REVERSE);
820                        break;
821                }               
822                if(nError!=CModbus::ERR_OK){
823                        WaitCursor.Restore();
824                        AfxMessageBox(pModbus->ErrorMessage(nError));
825                }
826                }
827                break;
828
829        case WRITE_MULTIPLE_COILS:
830                {
831                //controle spin
832                CSpinButtonCtrl* pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2);
833//              pSpin->SetRange(0,100);//plage du control : 0-100
834
835                m_bValueMultiple.SetAt(wIndex,((wValue!=0)?1:0));
836
837                nError=pModbus->ForceMultipleCoils(byDevice,wAddr,wQuant,m_bValueMultiple);
838                if(nError!=CModbus::ERR_OK){
839                        WaitCursor.Restore(); 
840                        AfxMessageBox(pModbus->ErrorMessage(nError));
841                }
842                }
843                break;
844               
845        }
846       
847}
848
849CModbus* CModbucfgView::GetConnection()
850{
851
852        int i;
853        CModbus* pModbus=NULL;
854        CConnection* pConnection=NULL;
855        CString sKey;
856
857        i=m_cboConnections.GetCurSel();
858       
859        if (i<0) {
860                ASSERT(FALSE);
861                pModbus=NULL;
862        }
863        else {
864                m_cboConnections.GetLBText(i,sKey);
865               
866                if (gConnections.Lookup(sKey,pConnection)) {
867               
868                        pModbus=pConnection->m_pModbus;
869                }
870                else {
871                        ASSERT(FALSE);
872                        pModbus=NULL;
873                }
874        }
875       
876        return pModbus;
877}
878
879void CModbucfgView::OnCbnSelchangeCboReadFunction()
880{
881        // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
882}
883
884void CModbucfgView::OnCbnSelchangeCboWriteFunction()
885{
886        // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
887}
888
889
890void CModbucfgView::OnAppMemMap()
891{
892        // TODO : ajoutez ici le code de votre gestionnaire de commande
893        AfxMessageBox(_T("modbus memory map : \n\n -holding registers adr:0x2000 qty:300\n-coils adr:0x3000 qty:100\n-discrete inputs adr:0x1000 qty:4\n-input registers adr:0x4000 qty:4"));
894}
895
896void CModbucfgView::OnEnChangeEditQuant()
897{
898        // TODO :  S'il s'agit d'un contrôle RICHEDIT, le contrôle
899        // n'enverra la notification que si vous substituez la fonction __super::OnInitDialog()
900        // et l'appel CRichEditCtrl().SetEventMask()
901        // par l'indicateur ENM_CHANGE assorti de l'opérateur OR dans le masque.
902
903        // TODO :  Ajoutez ici le code de votre gestionnaire de notification de contrôle
904}
905
906void CModbucfgView::OnEnChangeEditAddr()
907{
908        // TODO :  S'il s'agit d'un contrôle RICHEDIT, le contrôle
909        // n'enverra la notification que si vous substituez la fonction __super::OnInitDialog()
910        // et l'appel CRichEditCtrl().SetEventMask()
911        // par l'indicateur ENM_CHANGE assorti de l'opérateur OR dans le masque.
912
913        // TODO :  Ajoutez ici le code de votre gestionnaire de notification de contrôle
914}
915
916void CModbucfgView::OnEnChangeEditQuant2()
917{
918        // TODO :  S'il s'agit d'un contrôle RICHEDIT, le contrôle
919        // n'enverra la notification que si vous substituez la fonction __super::OnInitDialog()
920        // et l'appel CRichEditCtrl().SetEventMask()
921        // par l'indicateur ENM_CHANGE assorti de l'opérateur OR dans le masque.
922
923        // TODO :  Ajoutez ici le code de votre gestionnaire de notification de contrôle
924}
925
926void CModbucfgView::OnLbnSelchangeList5()
927{
928        // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
929}
930
931void CModbucfgView::OnLbnSelchangeLstValues()
932{
933        // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
934}
935
936void CModbucfgView::OnEnChangeEditAddrWri()
937{
938        // TODO :  S'il s'agit d'un contrôle RICHEDIT, le contrôle
939        // n'enverra la notification que si vous substituez la fonction __super::OnInitDialog()
940        // et l'appel CRichEditCtrl().SetEventMask()
941        // par l'indicateur ENM_CHANGE assorti de l'opérateur OR dans le masque.
942
943        // TODO :  Ajoutez ici le code de votre gestionnaire de notification de contrôle
944}
945
946void CModbucfgView::OnEnChangeEditValue()
947{
948        // TODO :  S'il s'agit d'un contrôle RICHEDIT, le contrôle
949        // n'enverra la notification que si vous substituez la fonction __super::OnInitDialog()
950        // et l'appel CRichEditCtrl().SetEventMask()
951        // par l'indicateur ENM_CHANGE assorti de l'opérateur OR dans le masque.
952
953        // TODO :  Ajoutez ici le code de votre gestionnaire de notification de contrôle
954}
955
956
957
958void CModbucfgView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
959{
960        // TODO : ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels
961
962        if (nSBCode == SB_ENDSCROLL)
963        {
964                return ;//rejeter les messages non validess
965        }
966        //treiter uniquement les messagse de défilement de IDC_SPIN2)
967        if (pScrollBar->GetDlgCtrlID()==IDC_SPIN2)
968        {
969                CString strValue;
970                strValue.Format("%d",(int)nPos);
971                ((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strValue);
972        }
973
974        __super::OnVScroll(nSBCode, nPos, pScrollBar);
975}
976
977
978void CModbucfgView::OnCmdRead()
979{
980        ldiv_t div_result;
981    float fUpdateSpeed;
982        DWORD dwTime;
983        CString str;
984        WORD nError;
985   
986        int iNumLoops=10;
987       
988       
989        fUpdateSpeed=0.0;
990       
991        if ((m_cboReadFunctions.GetCurSel()>=LOOP_BACK_TEST)&&
992                (m_cboReadFunctions.GetCurSel()<=READ_INPUT_STATUS)){
993               
994                m_dwCount++;
995                nError=ExecuteCmdReadFunction(m_cboReadFunctions.GetCurSel(),dwTime,str);
996                m_dwSum +=dwTime; 
997               
998                div_result = ldiv(m_dwCount,iNumLoops);
999               
1000                if (CModbus::ERR_OK!=nError){
1001                        m_dwErrors++;
1002                }
1003               
1004                if (0==div_result.rem){
1005                        fUpdateSpeed=(float)(iNumLoops*1000)/(float)m_dwSum;
1006                        m_dwSum=0; 
1007                }
1008                else {
1009                        fUpdateSpeed=(float)(1*1000)/(float)dwTime;
1010                }
1011
1012                m_staError.SetWindowText(str);
1013                str.Format("%d Errors=%d  %4.2f(Up./s) ",m_dwCount,m_dwErrors,fUpdateSpeed); 
1014                m_statStatus.SetWindowText(str);
1015        }
1016       
1017}
1018
1019WORD CModbucfgView::ExecuteCmdReadFunction(int iFunction,DWORD& dwTime, CString& rErrorMessage)
1020{
1021        CModbus* pModbus;
1022        CShortArray aValues;
1023        CByteArray abCoilValues;
1024       
1025        CFloatArray afValues;
1026        CDblArray adValues;
1027
1028    CString str;
1029        CString sAux;
1030    WORD nError;
1031        int i;
1032        BOOL bRegisters;
1033        DWORD dwStart;
1034        CString sKey;
1035        CConnection* pConnection =NULL;
1036        BYTE byDevice;
1037        WORD wQuant;
1038        WORD wAddr;
1039        int nIndex;
1040        int nPreviusCount;
1041        int iDataType;
1042   
1043        i=m_cboConnections.GetCurSel();
1044
1045        iDataType= m_cboDataType.GetCurSel();
1046
1047        if (i<0) {
1048                return 0;
1049        }
1050        else {
1051                m_cboConnections.GetLBText(i,sKey);
1052               
1053                if (gConnections.Lookup(sKey,pConnection)) {
1054               
1055                        pModbus=pConnection->m_pModbus;
1056                }
1057                else {
1058                        ASSERT(FALSE);
1059                        return 0;
1060                }
1061        }
1062
1063        m_edtDevice.GetWindowText(str);
1064       
1065        byDevice=BYTE(atoi(str));
1066
1067        m_edtQuant.GetWindowText(str);
1068        wQuant=BYTE(atoi(str));
1069
1070        m_edtReadAddr.GetWindowText(str);
1071        wAddr=WORD(atoi(str));
1072
1073        switch (iFunction) {
1074
1075        case LOOP_BACK_TEST:
1076                dwStart=::timeGetTime();
1077                nError=pModbus->LoopbackTest(byDevice);
1078                dwTime=::timeGetTime()-dwStart;
1079                str="";
1080                bRegisters=FALSE;
1081                break;
1082       
1083        case READ_OUTPUT_REGISTERS:     
1084                dwStart=::timeGetTime();
1085                switch (iDataType) {                   
1086                case DATA_CHAR:
1087                case DATA_SIGNED_16:
1088                case DATA_UNSIGNED_16:
1089                        aValues.SetSize(wQuant);
1090                        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, aValues);
1091                        break;
1092                case DATA_FLOAT:
1093                        afValues.SetSize(wQuant);
1094                        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, afValues);
1095                        break;
1096                case DATA_FLOAT_REVERSE:
1097                        afValues.SetSize(wQuant);
1098                        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, afValues,CModbus::REAL_REVERSE);
1099                        break;
1100                case DATA_DOUBLE:
1101                        adValues.SetSize(wQuant);
1102                        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, adValues);
1103                        break;
1104                case DATA_DOUBLE_REVERSE:
1105                        adValues.SetSize(wQuant);
1106                        nError=pModbus->ReadOutputRegisters(byDevice,wAddr,wQuant, adValues,CModbus::REAL_REVERSE);
1107                        break;
1108                }               
1109                dwTime=::timeGetTime()-dwStart;
1110                bRegisters=TRUE;       
1111                break;
1112
1113                case READ_INPUT_REGISTERS:     
1114                        dwStart=::timeGetTime();
1115                        switch (iDataType) {                           
1116                        case DATA_CHAR:
1117                        case DATA_SIGNED_16:
1118                        case DATA_UNSIGNED_16:
1119                                aValues.SetSize(wQuant);
1120                                nError=pModbus->ReadInputRegisters(byDevice,wAddr,wQuant, aValues);
1121                                break;
1122                        case DATA_FLOAT:
1123                                afValues.SetSize(wQuant);
1124                                nError=pModbus->ReadInputRegisters(byDevice,wAddr,wQuant, afValues);
1125                                break;
1126                        case DATA_FLOAT_REVERSE:
1127                                afValues.SetSize(wQuant);
1128                                nError=pModbus->ReadInputRegisters(byDevice,wAddr,wQuant, afValues,CModbus::REAL_REVERSE);
1129                                break;
1130                        case DATA_DOUBLE:
1131                                adValues.SetSize(wQuant);
1132                                nError=pModbus->ReadInputRegisters(byDevice,wAddr,wQuant, adValues);
1133                                break;
1134                        case DATA_DOUBLE_REVERSE:
1135                                adValues.SetSize(wQuant);
1136                                nError=pModbus->ReadInputRegisters(byDevice,wAddr,wQuant, adValues,CModbus::REAL_REVERSE);
1137                                break;
1138                        }
1139                        dwTime=::timeGetTime()-dwStart;
1140                        bRegisters=TRUE;
1141                        break;
1142                       
1143                case READ_OUTPUT_STATUS:
1144                        dwStart=::timeGetTime();
1145                        abCoilValues.SetSize(wQuant);
1146                        nError=pModbus->ReadOutputStatus(byDevice,wAddr,wQuant, abCoilValues);
1147                        dwTime=::timeGetTime()-dwStart;
1148                        bRegisters=FALSE;
1149                        break;
1150                               
1151                case READ_INPUT_STATUS:
1152                        dwStart=::timeGetTime();
1153                        abCoilValues.SetSize(wQuant);
1154                        nError=pModbus->ReadInputStatus(byDevice,wAddr,wQuant, abCoilValues); 
1155                        dwTime=::timeGetTime()-dwStart;
1156                        bRegisters=FALSE;
1157                        break;
1158        }
1159
1160        nIndex=m_lstValues.GetCurSel();
1161        nPreviusCount=m_lstValues.GetCount();
1162
1163        m_lstValues.SetRedraw(FALSE);
1164       
1165        if (bRegisters) {
1166                for(i=0;i<wQuant;++i) {
1167                        switch (iDataType) {
1168                        case DATA_CHAR:
1169                                sAux.Format("[%u]=%c 0x%x",wAddr+i,(char)aValues[i],(WORD)aValues[i]);
1170                            break;
1171            case DATA_SIGNED_16:
1172                                sAux.Format("[%u]=%d 0x%x",wAddr+i,aValues[i],(WORD)aValues[i]);
1173                                break;
1174                        case DATA_UNSIGNED_16:
1175                                sAux.Format("[%u]=%d 0x%x",wAddr+i,(WORD)aValues[i],(WORD)aValues[i]);
1176                                break;
1177            case DATA_FLOAT:
1178                        case DATA_FLOAT_REVERSE:
1179                                sAux.Format("[%u]=%g ",wAddr+2*i,afValues[i]);
1180                                break;
1181                        case DATA_DOUBLE:
1182                        case DATA_DOUBLE_REVERSE:
1183                                sAux.Format("[%u]=%g ",wAddr+4*i,adValues[i]);
1184                                break;
1185                        }                       
1186                        //sAux.Format("[%u]=%d  %d  0x%x  ",wAddr+i,aValues[i],(WORD)aValues[i],(WORD)aValues[i]);
1187                        m_lstValues.DeleteString(i);
1188                        m_lstValues.InsertString(i,sAux);
1189                }
1190        }
1191        else {         
1192                for(i=0;i<abCoilValues.GetSize();++i) {
1193                        sAux.Format("[%u]=%d ",wAddr+i,abCoilValues[i]);
1194                        m_lstValues.DeleteString(i);
1195                        m_lstValues.InsertString(i,sAux);
1196                }
1197        }
1198
1199        if (nPreviusCount>wQuant) {
1200                for (i=wQuant;i<nPreviusCount;i++){
1201                        m_lstValues.DeleteString(wQuant);
1202                }
1203        }
1204       
1205        if ((nIndex>0)&&(nIndex<m_lstValues.GetCount())) {
1206                m_lstValues.SetCurSel(nIndex);
1207        }
1208
1209        m_lstValues.SetRedraw(TRUE);
1210        m_lstValues.Invalidate(FALSE);
1211               
1212        rErrorMessage=pModbus->ErrorMessage(nError);
1213        return nError;
1214}
1215
1216void CModbucfgView::OnEnChangeEdit16()
1217{
1218        BYTE byDevice=0;
1219        WORD wAddr=2023;
1220        CModbus* pModbus=GetConnection();
1221        WORD nError=CModbus::ERR_OK;
1222        CString str, sVal;
1223        CWaitCursor WaitCursor;
1224
1225        if (pModbus==NULL)
1226                return;
1227
1228        m_edtDevice.GetWindowText(str);
1229        byDevice = (BYTE)atoi(str);
1230
1231        GetDlgItem(IDC_EDIT16)->GetWindowText(sVal);
1232        AfxMessageBox("CModbucfgView::OnEnChangeEdit16()");     
1233        //case DATA_FLOAT:
1234        nError=pModbus->PresetSingleRegister(byDevice,wAddr,float(atof(sVal)));
1235        if(nError!=CModbus::ERR_OK){
1236                WaitCursor.Restore(); 
1237                AfxMessageBox(pModbus->ErrorMessage(nError));
1238        }
1239}
1240
1241void CModbucfgView::OnBnClickedButton1()
1242{
1243        CString OpenFilter;
1244        OpenFilter = "Text File (*.txt)|*.txt||";
1245
1246        //créer l'instance avec le constructeur
1247        CFileDialog FileOpenDialog(
1248                TRUE,//ouverture de la boite de dialogue
1249                NULL,
1250                NULL,
1251                OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
1252                OpenFilter, // filtre
1253                AfxGetMainWnd()); // la fenetre parent
1254
1255        if(FileOpenDialog.DoModal()==IDOK)//affichage
1256        {// ouverture de fichier avec la structure suivante :
1257                //SVil Sleil STc Nbal_max Fr N_cur N_Seqcond Num_C(8x)
1258                unsigned int wTmpBuf;
1259                float fTmpBuf;
1260                CWordArray writeParamInit_120;
1261                CFloatArray writeParamInit_121;
1262                writeParamInit_120.SetSize(100);//pr les adresses modbus
1263                writeParamInit_121.SetSize(100);
1264                CString str;
1265                FILE* pFile = fopen (FileOpenDialog.GetPathName(), "r");       
1266                if(pFile == NULL)               
1267                        return; 
1268                /* ptr au debut du fichier*/
1269                fseek( pFile, 0L, SEEK_SET );
1270                /* lecture a artir du fichier*/
1271                fscanf(pFile,"%d ",&wTmpBuf);
1272                writeParamInit_120.SetAtGrow(0,wTmpBuf);//SVil
1273                fscanf(pFile,"%f ",&fTmpBuf);
1274                writeParamInit_121.SetAtGrow(0,fTmpBuf);//Sleil
1275                fscanf(pFile,"%f ",&fTmpBuf);
1276                writeParamInit_121.SetAtGrow(1,fTmpBuf);//STc
1277                for (int i=3;i<14;i++){//nb de mots ds le fichier
1278                        fscanf(pFile,"%d ",&wTmpBuf);
1279                        if (i<5)
1280                                writeParamInit_120.SetAtGrow(i+2,wTmpBuf);//Nbal_max/Fr
1281                        else if (i==5)
1282                                writeParamInit_120.SetAtGrow(i+22,wTmpBuf);//NSeq_cond
1283                        else if (i>5)
1284                                writeParamInit_120.SetAtGrow(i+24,wTmpBuf);//8xNum_C
1285                }
1286                fclose(pFile);
1287
1288                str.Format("SVil=%d, Sleil=%f NSeqcond=%d",writeParamInit_120[0],writeParamInit_121[0],writeParamInit_120[27]);
1289                AfxMessageBox(str);
1290
1291                //copie des buffers
1292                m_wValueMultiple.Copy( writeParamInit_120 );
1293                m_fValueMultiple.Copy( writeParamInit_121 );
1294        }
1295}
1296
1297void CModbucfgView::OnBnClickedButton2()
1298{
1299        BYTE byDevice=0;
1300        WORD wAddr=0;
1301        CString strValue;
1302        CWaitCursor WaitCursor;
1303
1304        WORD wQuant;
1305
1306        m_edtDevice.GetWindowText(strValue);
1307        byDevice = (BYTE)atoi(strValue);
1308
1309//      case DATA_UNSIGNED_16:
1310        CModbus* pModbus=GetConnection();
1311        WORD nError=CModbus::ERR_OK;
1312        if (NULL==pModbus) {
1313                return;
1314        }
1315        wAddr = 2020;
1316        wQuant=38;
1317        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_wValueMultiple);
1318
1319//      case DATA_FLOAT:
1320        pModbus=GetConnection();
1321        if (NULL==pModbus) {
1322                return;
1323        }
1324        wAddr = 2021;
1325        wQuant=2;
1326        nError=pModbus->PresetMultipleRegisters(byDevice,wAddr,wQuant,m_fValueMultiple);
1327       
1328        if(nError!=CModbus::ERR_OK){
1329                WaitCursor.Restore();
1330                AfxMessageBox(pModbus->ErrorMessage(nError));
1331        }               
1332}
Note: See TracBrowser for help on using the repository browser.