質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C++

    3239questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • VB.NET

    872questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • Visual Studio 2013

    305questions

    Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

PMX18-5AのサンプルプログラムVBをC++に書き直したい

受付中

回答 2

投稿 編集

flag 質問者が12時間前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 117

ryop9982

score 4

 前提・実現したいこと

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週間調べたのですがなかなか理解できず何か助言をいただけないでしょうか?

 該当のソースコード

Imports Ivi.Visa.Interop



Public Class Form1



    Dim rm As ResourceManager

    Dim msg As IMessage



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        rm = CreateObject("VISA.GlobalRM")

        ' msg = rm.Open("MYDEV1", AccessMode.NO_LOCK, 0, "")  'VISAエイリアスを使用した例

        'msg = rm.Open("USB0::0x0B3E::0x1029::00000001::INSTR", AccessMode.NO_LOCK, 0, "")  'USBを使用した例

        msg = rm.Open("TCPIP::192.168.11.2::inst0::INSTR", AccessMode.NO_LOCK, 0, "")  'LANを使用した例

        msg.TerminationCharacterEnabled = True



    End Sub



    'IDの問い合わせ

    Private Sub cmdIdn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIdn.Click

        msg.WriteString("*IDN?" & vbLf)

        TextBox1.Text = msg.ReadString(256)

    End Sub



    '電圧設定、電流設定

    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



    '電圧測定値の問い合わせ

    Private Sub cmdMeas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMeas.Click

        msg.WriteString("MEAS:VOLT?" & vbLf)

        TextBox1.Text = msg.ReadString(256)

    End Sub



    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed

        msg.Close()

    End Sub

End Class
#include"stdafx.h"
#include"visa.h"

int _tmain(int argc, _TCHAR* argv[]){
    ViSession rm, inst;
    ViSession viError;
    viError = viOpenDefaultRM(&rm);
    viError = viOpen(rm, "TCPIP::192.168.11.2::inst0::INSTR", VI_NULL, VI_NULL, &inst);

    viError = viPrintf(inst, "*IDN? \n");

    char buf[256];
    viError = viScanf(inst, "%256t", buf);
    printf("*IDN?:%s\n", buf);

    viError = viClose(inst);
    viError = viClose(rm);

    getchar();

    return 0;

}
#import "C:\Program Files\IVI Foundation\VISA\VisaCom64\GlobMgr.DLL" no_namespace named_guids

IMessagePtr spMsg;
IMessage* pMsg = NULL;

HRESULT hr;
IResourceManager3Ptr spRM;
hr = spRM.CreateInstance(CLSID_ResourceManager);

IMessagePtr spMsg;
spMsg = spRM->Open(L"TCPIP::192.168.11.2::inst0::INSTR", NO_LOCK, 0, L"");

SAFEARRAY* pSA = NULL;
try {
    pSA = spRM->FindRsrc(L"?*INSTR");
    r = spmsg->WriteString(L"CURR 20.0\n");
    r = spmsg->WriteString(L"VOLT 5.5\n");

}
catch (_com_error e) {
    //エラー・コードとメッセージは_com_error クラスのメンバー関数から取得できる
    HRESULT hr = e.Error();
    _bstr_t strDescription = e.Description();
}
if (pSA) {

    BSTR* rgElems = NULL;
    ::SafeArrayAccessData(pSA, (PVOID*)&rgElems);
    ASSERT(rgElems);
    LONG lLBound, lUBound;
    ::SafeArrayGetLBound(pSA, 1, &lLBound);
    ::SafeArrayGetUBound(pSA, 1, &lUBound);
    for (long lNdx = lLBound; lNdx <= lUBound; lNdx++) {
        _bstr_t strFound = rgElems[lNdx];
    }
    ::SafeArrayUnaccessData(pSA);
    ::SafeArrayDestroyData(pSA);
}


spMsg->Close();

 補足情報(FW/ツールのバージョンなど)

Visual Studio2013
KI-VISA

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

msg.WriteString("OUTP 0" & vbLf) 

ふつーに、
int x=0;
sprintf(msg,"OUTP %d\n",x);
でいけるんじゃないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/10 18:43

    sprintfを使用すると
    error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    のエラーでspirintf_sを使用しようとしたのですが
    error C2664: 'int sprintf_s(char *,size_t,const char *,...)' : 引数 2 を 'const char [9]' から 'size_t' へ変換できません。
    IntelliSense: オーバーロードされた関数 "sprintf_s" のインスタンスが引数リストと一致しません
    引数の型: (ViString, const char [9], int)

    とのエラーで使用することができませんでした。
    このエラーは何故でしょうか・・・?

    キャンセル

  • 2018/08/10 18:53

    ↑使い方間違ってるから。
    char buf[100];
    sprint_s(buf, 100,"フォーマット"...) みたく、文字列を詰め込むエリアの"大きさ"を引数に与えんと。

    キャンセル

  • 2018/08/10 19:09 編集

    すみません。
    勉強します。

    使い方を間違えていました・・・
    ちゃんと調べて一つ一つ書きたいと思います・・・

    ありがとうございました。

    キャンセル

  • 2018/08/10 19:45

    > msg.WriteString
    ここの msg はメーカー提供クラスのオブジェクト。従って、sprintf() に置き換える事自体が無意味。 (まあ、文字列にして そのまま、出力はありだけど)

    キャンセル

  • 2018/08/10 20:13

    ああ、VisualStudioではscanfとかprintfは使えないようになってる。
    とにかく、ふつーにASCII文字列を送信するようにすればコントロールできるから、そうするべし。

    キャンセル

  • 2018/08/11 17:22

    答えてくださりありがとうございます。
    ASCII文字列で操作方法がわからないので調べてやっていますがASCII文字列で電圧値の操作がよくわからず調べても出てこないので
    時間がかかりますがまた時間が経って質問してもいいでしょうか?

    キャンセル

0

VB のコードをそのまま、C++に書き換えれば、良いのではないでしょうか?
(文法レベルの書き換え)
メーカーのサイトに資料があるみたいなので、それを元に、VBコードが何をしているか、調べ、 C++ に置き換えると手順が妥当ですが、元のVBコードは比較的、シンプルなので、そのままでも OKかと。(... と思ったが、ライブラリ提供しているメーカーがどの C++を想定しているか要確認)

msg.WriteString("OUTP 0" & vbLf) 

--> msg.WriteString("OUTP 0\n");   // で良いかも 

ただ、元のVBコードは、

  msg = rm.Open("TCPIP::192.168.11.2::inst0::INSTR", AccessMode.NO_LOCK, 0, "")  'LANを使用した例
  msg.TerminationCharacterEnabled = True

となっていますが、対応する C++ コードがありません。

また、VBが Formアプリに対し、C++ が tmain()で始まっていますが、何かあるのでしょうか? また、検索して引っ掛かったのが、 C# が多かったですが、 C++にこだわる理由はなにかありますか? (メーカーのサポート対象になってますか?)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/10 19:08

    メーカのライブラリはC++は対応しているみたいです。
    ただ、C++/CLI、C#、VBが多くコードの書き換えがなかなか理解できません・・・

    msg = rm.Open("TCPIP::192.168.11.2::inst0::INSTR", AccessMode.NO_LOCK, 0, "") 'LANを使用した例
    msg.TerminationCharacterEnabled = True
    此処に関してはメーカのC++の書き方に対応するようなものを探してみます・・・

    C++にこだわる理由は、別の作った画像認識のプログラムがあるのですが
    その画像認識のプログラムで得た角度に応じて流す電圧値を変えていくというプログラムを最終的に作りたくて
    その画像認識のプログラムがC++で作ったためつなげやすいようC++で書こうかなと考えています。

    キャンセル

  • 2018/08/10 19:53

    画像処理プログラムは、C++/CLI に対応しているでしょうか? C++/CLIは、MS 独自仕様(?) で、普通のC++ と違うという事も聞きます。(詳しくないので、詳細は勘弁) こちらも確認された方が、後の苦労も少ないと思います。地道に調べれば、なんとかなる場合が多いですが、トラップも沢山待ってます。
    > msg = rm.Open("TCPIP::192.168.11.2::i .....
    このあたりは、さっき検索したら、C# ソースは見つかりました。(メーカードキュメント) C++ については、未確認。

    キャンセル

  • 2018/08/10 22:22

    多分C#で書くほうが幸せだと思うなぁ、C++/CLIやるよりは

    キャンセル

  • 2018/08/11 16:26

    そうですよね・・・
    少し別のアプローチを考えたいと思います・・・

    お付き合いくださりありがとうございました

    キャンセル

  • 2018/08/11 17:35

    何が良いかは色々と見解はあるでしょうが、
    一つの問題として、最近のVisualStudio では、C++は非推奨となっており、標準設定では、新規Formアプリが作れません。(メンテナンスは OK)
    画像処理プログラムが画面表示まで行っていると大変かも知れませんが、内容次第では、C#移行の検討対象にしても良いのではないでしょうか?
    C++/CLI だったら、C#移行はそんなに大変では無いと思います。

    キャンセル

  • 2018/08/11 17:43

    C++のプログラムに電圧値の操作を書き足そうと思ったのですが

    質問なのですが、
    msg.WriteString("OUTP 0\n");
    と書いた場合クラスを作らないといけないと思うのですが

    この場合どのように作っていくのでしょうか・・・
    class t::_tmain(int argc, _TCHAR* argv[]){
    public:
    int msg;
    };
    自分はこのようにして書いたのですがエラーがでました・・・
    この辺りはどうしたらよいのでしょうか・・・

    キャンセル

  • 2018/08/11 17:46

    そうだったのですね・・・
    本当は画像認識のプログラムに電圧値だけ書き足してメインは画像認識と思っていたのですが
    電源装置のプログラムに関して全然わからず困っていました。

    お盆終わりに周りの人と相談をして考えてみます・・・
    図書館などしまってますし調べるのも苦労なので・・・💦

    キャンセル

  • 2018/08/11 18:05 編集

    > msg.WriteString("OUTP 0\n");
    > と書いた場合クラスを作らないといけないと思うのですが
    上のコメントにもちょっと書きましたが、VBコードを見ると IMessage クラスです。これは、状況的に、メーカー提供のライブラリクラスです。
    で、作るのはクラスで無く、オブジェクト。(この辺は記法の相違のみで VBも同じ)
    これに対応するのが、C++ では何かという事です。多分、同じ名前であると思いますが、推測なので、確認する必要があるという事です。
    あっ、と、この辺の情報は図書館で難しいです。メーカーサイトにドキュメントがある筈なので、探しましょう。

    キャンセル

  • 2018/08/13 01:44

    https://www.kikusui.co.jp/download/doc/KiVisaGuide_2012(July)_J.pdf
    のP103にC++の記述方法がかかれていました。
    IMessageのクラスと教えていただいて少し概要がわかった気がします!

    インターフェースの参照で
    spMsg=spRM->Open(L”TCPIP::192.168.11.2::inst0::INSTR”,NO_ROCK,0,L”);

    r=songs->WriteString(L”VOLT 5.5 /n”);
    などでできるんじゃないかなと思いました。

    PMX18-5Aがいまリコールで持っていかれてしまったので現在試せないですが、試したいと思います。
    ありがとうございます!

    キャンセル

  • 2018/08/13 16:20

    というかよく見たらただのTCP/IPか・・・?ソケット通信ならboost:asio使うという手もある。

    キャンセル

  • 2018/08/13 19:43

    boost:asioは初めて知りました…
    TCPで同期通信だったり、非同期I/Oライブラリと書いてありました
    たしかに使えそうな気がします。
    調べて少しやってみようと思います

    ありがとうございます!

    キャンセル

  • 2018/08/13 21:53

    > ソケット通信ならboost:asio使う
    それを使うのも良いかもしれませんが、その場合、メーカー提供ライブラリは使えないと理解しましょう。(アクセスが競合するため)
    どちらが良いかは、担当者の責任ですが、まあ、一般的には、メーカーライブラリでしょう。(こちらの場合、メーカーに問合せできる)

    キャンセル

  • 2018/08/13 23:47

    補足ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3239questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • VB.NET

    872questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • Visual Studio 2013

    305questions

    Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです