前提・実現したいこと
VBのプログラムをC++で書き直したい。
いろいろなサンプルプログラムを読みPMX18-5Aの電源装置をプログラムで通信しているということは確認できました。
しかし、電圧、電流を扱う部分の書き方がVBをC++に直す際にわかりません。
Private Sub cmdCurr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCurr.Click msg.WriteString("OUTP 0" & vbLf) msg.WriteString("VOLT 10" & vbLf) msg.WriteString("CURR 5" & vbLf) msg.WriteString("OUTP 1" & vbLf) End Sub
この部分をC++に書き直そうと思ったのですが、どうしたらいいのでしょうか・・・
1週間調べたのですがなかなか理解できず何か助言をいただけないでしょうか?
該当のソースコード
VB
1Imports Ivi.Visa.Interop 2 3 4 5Public Class Form1 6 7 8 9 Dim rm As ResourceManager 10 11 Dim msg As IMessage 12 13 14 15 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 16 17 rm = CreateObject("VISA.GlobalRM") 18 19 ' msg = rm.Open("MYDEV1", AccessMode.NO_LOCK, 0, "") 'VISAエイリアスを使用した例 20 21 'msg = rm.Open("USB0::0x0B3E::0x1029::00000001::INSTR", AccessMode.NO_LOCK, 0, "") 'USBを使用した例 22 23 msg = rm.Open("TCPIP::192.168.11.2::inst0::INSTR", AccessMode.NO_LOCK, 0, "") 'LANを使用した例 24 25 msg.TerminationCharacterEnabled = True 26 27 28 29 End Sub 30 31 32 33 'IDの問い合わせ 34 35 Private Sub cmdIdn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIdn.Click 36 37 msg.WriteString("*IDN?" & vbLf) 38 39 TextBox1.Text = msg.ReadString(256) 40 41 End Sub 42 43 44 45 '電圧設定、電流設定 46 47 Private Sub cmdCurr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCurr.Click 48 49 msg.WriteString("OUTP 0" & vbLf) 50 51 msg.WriteString("VOLT 10" & vbLf) 52 53 msg.WriteString("CURR 5" & vbLf) 54 55 msg.WriteString("OUTP 1" & vbLf) 56 57 End Sub 58 59 60 61 '電圧測定値の問い合わせ 62 63 Private Sub cmdMeas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMeas.Click 64 65 msg.WriteString("MEAS:VOLT?" & vbLf) 66 67 TextBox1.Text = msg.ReadString(256) 68 69 End Sub 70 71 72 73 Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed 74 75 msg.Close() 76 77 End Sub 78 79End Class 80 81
C++
1#include"stdafx.h" 2#include"visa.h" 3 4int _tmain(int argc, _TCHAR* argv[]){ 5 ViSession rm, inst; 6 ViSession viError; 7 viError = viOpenDefaultRM(&rm); 8 viError = viOpen(rm, "TCPIP::192.168.11.2::inst0::INSTR", VI_NULL, VI_NULL, &inst); 9 10 viError = viPrintf(inst, "*IDN? \n"); 11 12 char buf[256]; 13 viError = viScanf(inst, "%256t", buf); 14 printf("*IDN?:%s\n", buf); 15 16 viError = viClose(inst); 17 viError = viClose(rm); 18 19 getchar(); 20 21 return 0; 22 23}
C++
1#import "C:\Program Files\IVI Foundation\VISA\VisaCom64\GlobMgr.DLL" no_namespace named_guids 2 3IMessagePtr spMsg; 4IMessage* pMsg = NULL; 5 6HRESULT hr; 7IResourceManager3Ptr spRM; 8hr = spRM.CreateInstance(CLSID_ResourceManager); 9 10IMessagePtr spMsg; 11spMsg = spRM->Open(L"TCPIP::192.168.11.2::inst0::INSTR", NO_LOCK, 0, L""); 12 13SAFEARRAY* pSA = NULL; 14try { 15 pSA = spRM->FindRsrc(L"?*INSTR"); 16 r = spmsg->WriteString(L"CURR 20.0\n"); 17 r = spmsg->WriteString(L"VOLT 5.5\n"); 18 19} 20catch (_com_error e) { 21 //エラー・コードとメッセージは_com_error クラスのメンバー関数から取得できる 22 HRESULT hr = e.Error(); 23 _bstr_t strDescription = e.Description(); 24} 25if (pSA) { 26 27 BSTR* rgElems = NULL; 28 ::SafeArrayAccessData(pSA, (PVOID*)&rgElems); 29 ASSERT(rgElems); 30 LONG lLBound, lUBound; 31 ::SafeArrayGetLBound(pSA, 1, &lLBound); 32 ::SafeArrayGetUBound(pSA, 1, &lUBound); 33 for (long lNdx = lLBound; lNdx <= lUBound; lNdx++) { 34 _bstr_t strFound = rgElems[lNdx]; 35 } 36 ::SafeArrayUnaccessData(pSA); 37 ::SafeArrayDestroyData(pSA); 38} 39 40 41spMsg->Close(); 42
補足情報(FW/ツールのバージョンなど)
Visual Studio2013
KI-VISA
自己解決方法
読み照らしながらC++で電圧値をプログラムから通信で変更することができました。
そのソースです。
#include "stdafx.h"
//タイプライブラリの作成
int _tmain(int argc, _TCHAR* argv[])
{
IMessagePtr spMsg; //スマート・ポインタ IMessagePtr型でCOMインターフェースを宣言、呼び出しを自動化している
CoInitializeEx(NULL, COINIT_MULTITHREADED); //COMを使うための宣言
HRESULT hr;
IResourceManager3Ptr spRM;
hr = spRM.CreateInstance(CLSID_ResourceManager); //CreateInstance()メソッドを使ってリソース・マネージャを作成
spMsg = spRM->Open(L"TCPIP::192.168.11.2::inst0::INSTR", NO_LOCK, 0, L""); //インターフェースの参照 SAFEARRAY* pSA = NULL; pSA = spRM->FindRsrc(L"TCPIP?* INSTR"); int r; r = spMsg->WriteString(L"OUTP 0 \n"); r = spMsg->WriteString(L"VOLT 10.0 \n"); r = spMsg->WriteString(L"CURR 5.0 \n"); r = spMsg->WriteString(L"OUTP 1 \n"); spMsg->Close(); //閉じる return 0;
}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/10 10:08
2018/08/10 10:53
2018/08/10 13:22
2018/08/11 07:26
2018/08/11 08:35
2018/08/11 08:43
2018/08/11 08:46
2018/08/11 09:06 編集
2018/08/12 16:44
2018/08/13 07:20
2018/08/13 10:43
2018/08/13 12:53
2018/08/13 14:47
2018/08/15 11:25
2018/08/15 14:48
2018/08/15 15:10
2018/08/15 15:38
2018/08/16 09:43
2018/08/16 10:20 編集
2018/08/19 01:14
2018/08/19 08:23