99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

PSIM仿真之外置DLL功能塊

作為PSIM初學者,計劃邊更貼邊學習,記錄自己的學習例程,希望可以幫助到其他的初學者。

首先,做以下幾個準備工作:

(1)下載PSIM9.0安裝包.

(2)閱讀《PSIM使用說明》,上面的下載鏈接里面有這個文件。我想用PSIM的外置DLL功能塊。之前也用過PSIM仿真電路,直接看了使用說明的第108頁到第110頁。

(3)看完這個之后,想著先看懂一個PSIM仿真例程,在PSIM免安裝包的examples文件下的custom dll文文件中,主要看例程中的pfc_vi_dll,這是由電感電流和負荷電壓反饋的功率因數校正電路。

全部回復(30)
正序查看
倒序查看
2016-10-29 12:47

(4)外置DLL功能塊,需要用C語言或者C++編程,然后用PSIM連接起來。所以要安裝Microsoft Visual C++2010。。找師姐要的安裝包,按照《Visual Studio 2010安裝實戰教程》的步驟安裝的。安裝好之后,寫了一個printf("HELLO\n");的程序,仿真出錯,提示錯誤原因是:LINK--fatal-error-LNK1123-轉換到-COFF-期間失敗-文件無效或損壞-還有warning-C4996。可百度解決該問題,替換一個文件即可。。。。(備注有說方法。)

當然我也是C語言初學者,哈哈,之后可能看程序需要一句一句查了。。。勿噴。么么噠。我是弱女子。哈哈

備注:

在電腦里面搜索發現

路徑1:C:\Program Files\Microsoft Visual Studio10.0\VC\bin   (說明:我的安裝目錄是在D盤,所以我找的是D盤里面的D:\Microsoft Visual C++2010\VC\bin)

路徑2:C:\Windows\winsxs\x86_netfxcvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7600.16385_none_ba476986f05abc65

(說明:我在我的電腦的C:\Windows\winsxs路徑下找到這三個文件,三個里面都有cvtres.exe文件,我找了一個最新的去替代上面路徑中的cvtres.exe文件

路徑3:C:\Windows\Microsoft.NET\Framework\v4.0.30319

這三個路徑里面都有cvtres.exe文件,嘗試使用第二個路徑里面的文件替換第一個路徑的文件,問題解決。

(這個問題是windows自動更新造成編譯器cvtres.exe的版本過低,如果windows再次更新,則還可能出現這樣的問題,屆時再重復一下上述步驟即可。)

0
回復
2016-10-29 14:05
@郭偉郭偉100
(4)外置DLL功能塊,需要用C語言或者C++編程,然后用PSIM連接起來。所以要安裝MicrosoftVisualC++2010。。找師姐要的安裝包,按照《VisualStudio2010安裝實戰教程》的步驟安裝的。安裝好之后,寫了一個printf("HELLO\n");的程序,仿真出錯,提示錯誤原因是:LINK--fatal-error-LNK1123-轉換到-COFF-期間失敗-文件無效或損壞-還有warning-C4996。可百度解決該問題,替換一個文件即可。。。。(備注有說方法。)[圖片]當然我也是C語言初學者,哈哈,之后可能看程序需要一句一句查了。。。勿噴。么么噠。我是弱女子。哈哈[圖片]備注:在電腦里面搜索發現路徑1:C:\ProgramFiles\MicrosoftVisualStudio10.0\VC\bin (說明:我的安裝目錄是在D盤,所以我找的是D盤里面的D:\MicrosoftVisualC++2010\VC\bin)路徑2:C:\Windows\winsxs\x86_netfxcvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7600.16385_none_ba476986f05abc65(說明:我在我的電腦的C:\Windows\winsxs路徑下找到這三個文件,三個里面都有cvtres.exe文件,我找了一個最新的去替代上面路徑中的cvtres.exe文件)[圖片]路徑3:C:\Windows\Microsoft.NET\Framework\v4.0.30319這三個路徑里面都有cvtres.exe文件,嘗試使用第二個路徑里面的文件替換第一個路徑的文件,問題解決。(這個問題是windows自動更新造成編譯器cvtres.exe的版本過低,如果windows再次更新,則還可能出現這樣的問題,屆時再重復一下上述步驟即可。)

(5)在PSIM免安裝包的examples文件下的custom dll文文件中,主要看例程中的pfc_vi_dl,有以下幾個文件

了解什么是dsw文件?(這個文件是workspa文件,需要用VC2010打開,所以才有了第三步安裝和下載Visual C++2010)

不知道為什么不能上傳附件,可能是因為剛剛申請的原因。。。。直接貼上百度的東西吧。。

引用鏈接:http://baike.baidu.com/view/1037844.htm

文件擴展名

首先要介紹的是擴展名為dsw的文件類型, 這種類型的文件在VC中是級別最高的, 稱為Workspace文件。在VC, 應用程序是以Project的形式存在的,Project文件以.dsp擴展名, Workspace文件中可以包含多個Project, Workspace文件對它們進行統一的協調和管理。

dsw類型的Workspace文件相配合的一個重要的文件類型是以opt為擴展名的文件, 這個文件中包含的是在Workspace文件中要用到的本地計算機的有關配置信息, 所以這個文件不能在不同的計算機上共享, 當我們打開一個Workspace文件時, 如果系統找不到需要的opt類型文件, 就會自動地創建一個與之配合的包含本地計算機信息的opt文件

上面提到Project文件的擴展名是dsp, 這個文件中存放的是一個特定的工程, 也就是特定的應用程序的有關信息, 每個工程都對應有一個dsp類型的文件。

clw為擴展名的文件是用來存放應用程序中用到的類和資源的信息的, 這些信息是VC中的ClassWizard工具管理和使用類的信息來源。它實際上是INI文件的格式,有時候ClassWizard出問題,手工修改CLW文件可以解決.如果此文件不存在的話,每次用ClassWizard的時候繪提示你是否重建。

對應每個應用程序有一個readme.txt文件, 這個文件中列出了應用程序中用到的所有的文件的信息, 打開并查看其中的內容就可以對應用程序的文件結構有一個基本的認識。

在應用程序中大量應用的是以hcpp為擴展名的文件, h為擴展名的文件稱為頭文件cpp為擴展名的文件稱為實現文件, 一般說來h為擴展名的文件與cpp為擴展名的文件是一一對應配合使用的, h為擴展名的文件中包含的主要是類的定義, 而在cpp為擴展名的文件中包含的主要是類成員函數的實現代碼。

在應用程序中經常要使用一些位圖、菜單之類的資源, VCrc為擴展名的文件稱為資源文件, 其中包含了應用程序中用到的所有的windows資源, 要指出的一點是rc文件可以直接在VC集成環境中以可視化的方法進行編輯和修改。

最后要介紹的是以rc2為擴展名的文件, 它也是資源文件, 但這個文件中的資源不能在VC的集成環境下直接進行編輯和修改, 而是由我們自己根據需要手工地編輯這個文件。

對于以ico,bmp等為擴展名的文件是具體的資源, 產生這種資源的途徑很多。使用rc資源文件的目的就是為了對程序中用到的大量的資源進行統一的管理。

0
回復
2016-10-29 14:07
@郭偉郭偉100
(5)在PSIM免安裝包的examples文件下的customdll文文件中,主要看例程中的pfc_vi_dl,有以下幾個文件[圖片]了解什么是dsw文件?(這個文件是workspa文件,需要用VC2010打開,所以才有了第三步安裝和下載VisualC++2010)不知道為什么不能上傳附件,可能是因為剛剛申請的原因。。。。直接貼上百度的東西吧。。引用鏈接:http://baike.baidu.com/view/1037844.htm文件擴展名首先要介紹的是擴展名為dsw的文件類型,這種類型的文件在VC中是級別最高的,稱為Workspace文件。在VC中,應用程序是以Project的形式存在的,Project文件以.dsp擴展名,在Workspace文件中可以包含多個Project,由Workspace文件對它們進行統一的協調和管理。與dsw類型的Workspace文件相配合的一個重要的文件類型是以opt為擴展名的文件,這個文件中包含的是在Workspace文件中要用到的本地計算機的有關配置信息,所以這個文件不能在不同的計算機上共享,當我們打開一個Workspace文件時,如果系統找不到需要的opt類型文件,就會自動地創建一個與之配合的包含本地計算機信息的opt文件。上面提到Project文件的擴展名是dsp,這個文件中存放的是一個特定的工程,也就是特定的應用程序的有關信息,每個工程都對應有一個dsp類型的文件。以clw為擴展名的文件是用來存放應用程序中用到的類和資源的信息的,這些信息是VC中的ClassWizard工具管理和使用類的信息來源。它實際上是INI文件的格式,有時候ClassWizard出問題,手工修改CLW文件可以解決.如果此文件不存在的話,每次用ClassWizard的時候繪提示你是否重建。對應每個應用程序有一個readme.txt文件,這個文件中列出了應用程序中用到的所有的文件的信息,打開并查看其中的內容就可以對應用程序的文件結構有一個基本的認識。在應用程序中大量應用的是以h和cpp為擴展名的文件,以h為擴展名的文件稱為頭文件。以cpp為擴展名的文件稱為實現文件,一般說來h為擴展名的文件與cpp為擴展名的文件是一一對應配合使用的,在h為擴展名的文件中包含的主要是類的定義,而在cpp為擴展名的文件中包含的主要是類成員函數的實現代碼。在應用程序中經常要使用一些位圖、菜單之類的資源,VC中以rc為擴展名的文件稱為資源文件,其中包含了應用程序中用到的所有的windows資源,要指出的一點是rc文件可以直接在VC集成環境中以可視化的方法進行編輯和修改。最后要介紹的是以rc2為擴展名的文件,它也是資源文件,但這個文件中的資源不能在VC的集成環境下直接進行編輯和修改,而是由我們自己根據需要手工地編輯這個文件。對于以ico,bmp等為擴展名的文件是具體的資源,產生這種資源的途徑很多。使用rc資源文件的目的就是為了對程序中用到的大量的資源進行統一的管理。
好啦,以上都是啰啰嗦嗦的準備工作。大概需要花費一天的時間吧。
0
回復
2016-10-29 14:10
@郭偉郭偉100
好啦,以上都是啰啰嗦嗦的準備工作。大概需要花費一天的時間吧。[圖片]

首先,發一個例程的完整程序吧。哈哈。完全的復制粘貼,待會邊看邊查邊學邊解釋。么么噠。

// This is a sample C program for Microsoft C/C++ 6.0.
// The generated DLL is to be linked to PSIM.

// To compile the program into DLL, you can open the workspace file "msvc_dll.dsw" 
// as provided.

// This sample program calculates the rms of a 60-Hz input in[0], and
// stores the output in out[0].

// Variables:
//      t: Time, passed from PSIM by value
//   delt: Time step, passed from PSIM by value
//     in: input array, passed from PSIM by reference
//    out: output array, sent back to PSIM (Note: the values of out[*] can
//         be modified in PSIM)

// The maximum length of the input and output array "in" and "out" is 30.

// Because we used static/global variables in this example, the DLL 
// can only be used once per schematic file.  

#include 

__declspec(dllexport) void simuser (double t, double delt, double *in, double *out)
{
// Place your code here............begin

//  Define following variables as "static" in order to retain their value.
	static double yv=0.0;
	static double yi=0.0;
	static double uv=0.0;
	static double ui=0.0;
	static double iref = 0.0;
	static int count=0;
	static int Ncount = 0;
	static int flagSample=1;
	static int npulse=0;
	static int npulse_next=0;
	static int gating=0;



	double Voref=10.5, Vcarr=10., Va, iL, Vo, Vm;
	double errv, erri, Ts=33.33e-6;

// Calculate the no. of counts in one period
	Ncount=Ts/delt;

// Check if the counter reaches the end of the period. If yes,
// set the sampling flag to 1. 
	if (count == Ncount)
	{
		flagSample=1;
//      Reset the counter to 0.
		count=0;
//      Update the on-time pulse width
		npulse=npulse_next;
	}

// If the sampling flag is 1, sample the inputs and calculate the
// on-time pulse width npulse.
	if (flagSample == 1)
	{
//		Reset the sampling flag
		flagSample=0;

//		Sample the inputs
		Va=fabs(in[0]);
		iL=in[1];
		Vo=in[2];

//		Calculate the outer loop PI controller using Trapezoidal Rule
		errv=Voref-Vo;
		yv=yv+(33.33*errv+uv)*Ts/2.;

		iref=(errv+yv)*Va;

//		Calculate the inner loop PI controller
		erri=iref-iL;
		yi=yi+(3400.*erri+ui)*Ts/2.;

		Vm=yi+0.3*erri;

//		Calculate the on-time pulse width.
//      Note that this value is not used within this sampling period, but 
//      is used at the beginning of the next sampling period.
		npulse_next=Ncount * (Vm/Vcarr);

//		Store old values
		uv=33.33*errv;
		ui=3400.*erri;

	}

// Generate the switch gating signal
	if (count <= npulse )
	{gating=1;}
	else
	{gating=0;}

// Output
	out[0]=gating;
	out[1]=iref;
	out[2]=npulse;

// Note: Among the 3 output variables, "gating" is calculated at
// every time step, but "iref" and "npulse" are calculated only
// once in one sampling period. Both "gating" and "iref" can be
// defined as either static or non-static. 
	
// But if "iref" is defined as non-static, its value will be zero at 
// the points other than the sampling point. In order to see the 
// value at the sampling point, the print step Iprint in the simulation
// control in SIMCAD must be set to 1. Otherwise the sampling point 
// may be skipped, resulting in a waveform of all zero.


// The variable "npulse" must be declared as static as its
// value is used at every time step and must be retained.


// Increment the counter by 1
	count++;

// Place your code here............end
}

0
回復
2016-10-29 14:33
@郭偉郭偉100
(5)在PSIM免安裝包的examples文件下的customdll文文件中,主要看例程中的pfc_vi_dl,有以下幾個文件[圖片]了解什么是dsw文件?(這個文件是workspa文件,需要用VC2010打開,所以才有了第三步安裝和下載VisualC++2010)不知道為什么不能上傳附件,可能是因為剛剛申請的原因。。。。直接貼上百度的東西吧。。引用鏈接:http://baike.baidu.com/view/1037844.htm文件擴展名首先要介紹的是擴展名為dsw的文件類型,這種類型的文件在VC中是級別最高的,稱為Workspace文件。在VC中,應用程序是以Project的形式存在的,Project文件以.dsp擴展名,在Workspace文件中可以包含多個Project,由Workspace文件對它們進行統一的協調和管理。與dsw類型的Workspace文件相配合的一個重要的文件類型是以opt為擴展名的文件,這個文件中包含的是在Workspace文件中要用到的本地計算機的有關配置信息,所以這個文件不能在不同的計算機上共享,當我們打開一個Workspace文件時,如果系統找不到需要的opt類型文件,就會自動地創建一個與之配合的包含本地計算機信息的opt文件。上面提到Project文件的擴展名是dsp,這個文件中存放的是一個特定的工程,也就是特定的應用程序的有關信息,每個工程都對應有一個dsp類型的文件。以clw為擴展名的文件是用來存放應用程序中用到的類和資源的信息的,這些信息是VC中的ClassWizard工具管理和使用類的信息來源。它實際上是INI文件的格式,有時候ClassWizard出問題,手工修改CLW文件可以解決.如果此文件不存在的話,每次用ClassWizard的時候繪提示你是否重建。對應每個應用程序有一個readme.txt文件,這個文件中列出了應用程序中用到的所有的文件的信息,打開并查看其中的內容就可以對應用程序的文件結構有一個基本的認識。在應用程序中大量應用的是以h和cpp為擴展名的文件,以h為擴展名的文件稱為頭文件。以cpp為擴展名的文件稱為實現文件,一般說來h為擴展名的文件與cpp為擴展名的文件是一一對應配合使用的,在h為擴展名的文件中包含的主要是類的定義,而在cpp為擴展名的文件中包含的主要是類成員函數的實現代碼。在應用程序中經常要使用一些位圖、菜單之類的資源,VC中以rc為擴展名的文件稱為資源文件,其中包含了應用程序中用到的所有的windows資源,要指出的一點是rc文件可以直接在VC集成環境中以可視化的方法進行編輯和修改。最后要介紹的是以rc2為擴展名的文件,它也是資源文件,但這個文件中的資源不能在VC的集成環境下直接進行編輯和修改,而是由我們自己根據需要手工地編輯這個文件。對于以ico,bmp等為擴展名的文件是具體的資源,產生這種資源的途徑很多。使用rc資源文件的目的就是為了對程序中用到的大量的資源進行統一的管理。
1
回復
2016-10-29 14:58
@郭偉郭偉100
LINK--fatal-error-LNK1123-轉換到-COFF-期間失敗-文件無效或損壞-還有warning-C4996.docVisualC++文件擴展名.docxVisualStudio2010安裝實戰教程.docxVisualStudio2010入門級使用教程.pdf
程序解釋如下:
(1):寫動態鏈接庫DLL相關的程序的時候,要用的兩個語句:第一是_declspec(dllimport),是DLL的導入,第二個是__declspec(dllexport),是DLL中的導出。
(2)__declspec(dllexport) void simuser (t, delt, in, out)要加上參數類型。比如__declspec(dllexport) void simuser (double t, double delt, double *in, double *out)         
 t指的是時間;delt指的是仿真步長;這兩個都在你的仿真電路的時鐘控制里面設置,編程不用管!!!
 in和out分別對應輸入輸出,用的時候直接用用數組形式賦值,比如a=in[0],out[0]=b;
英文解釋如下:
// Variables:
//      t: Time, passed from PSIM by value
//   delt: Time step, passed from PSIM by value
//     in: input array, passed from PSIM by reference
//    out: output array, sent back to PSIM (Note: the values of out[*] can
//         be modified in PSIM)
0
回復
2016-10-29 15:13
@郭偉郭偉100
程序解釋如下:(1):寫動態鏈接庫DLL相關的程序的時候,要用的兩個語句:第一是_declspec(dllimport),是DLL的導入,第二個是__declspec(dllexport),是DLL中的導出。(2)__declspec(dllexport)voidsimuser(t,delt,in,out)要加上參數類型。比如__declspec(dllexport)voidsimuser(doublet,doubledelt,double*in,double*out) t指的是時間;delt指的是仿真步長;這兩個都在你的仿真電路的時鐘控制里面設置,編程不用管!!!in和out分別對應輸入輸出,用的時候直接用用數組形式賦值,比如a=in[0],out[0]=b;英文解釋如下://Variables://t:Time,passedfromPSIMbyvalue//delt:Timestep,passedfromPSIMbyvalue//in:inputarray,passedfromPSIMbyreference//out:outputarray,sentbacktoPSIM(Note:thevaluesofout[*]can//bemodifiedinPSIM)

DLL模塊有小圓圈的一頭從上往下依次是in[0],[1],[2]和out[0],[1],[2]……

1
回復
bone2
LV.1
9
2016-10-29 16:48
太強了,lz大神,一起學習...
0
回復
2016-10-29 18:37
@郭偉郭偉100
DLL模塊有小圓圈的一頭從上往下依次是in[0],[1],[2]和out[0],[1],[2]……[圖片][圖片]

看程序用到了梯形積分法,即Trapezoidal Rule,先學一下幾個基本的數學概念吧。

0
回復
2016-10-31 12:16
@郭偉郭偉100
看程序用到了梯形積分法,即TrapezoidalRule,先學一下幾個基本的數學概念吧。[圖片][圖片][圖片][圖片]

基于梯形積分PI控制的LED反激式開關電源的研究_孫大洋.pdf

看一下這個文章,來更好的理解梯形積分吧。。。

//		Calculate the outer loop PI controller using Trapezoidal Rule
		errv=Voref-Vo;
		yv=yv+(33.33*errv+uv)*Ts/2.;

		iref=(errv+yv)*Va;

//		Calculate the inner loop PI controller
		erri=iref-iL;
		yi=yi+(3400.*erri+ui)*Ts/2.;

		Vm=yi+0.3*erri;
這段就是梯形積分的算法程序

errv=Voref-Vo;//是指誤差電壓=輸出參考電壓-采樣輸出電壓;errv是誤差電壓信號;

yv=yv+(33.33*errv+uv)*Ts/2.;//是誤差電壓信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為33.33),誤差電壓信號是有正有負的,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸出電壓和參考電壓相差不大,是自己想要的電壓;

iref=(errv+yv)*Va;//這是一個輸出由監視功能的電感電流量,ires和誤差電壓信號errv、誤差電壓信號的積分累計量yv、采樣的輸入電壓的絕對值Va都有關系。Va的絕對值是一個饅頭波,所以iref也是饅頭波。

以上是外部電壓環的PI控制器算法;


erri=iref-iL;//iL是采樣的輸入電流,功率因數校正就是希望iL的波形跟隨輸入電壓的變化而變化,也是一個饅頭波,iref就是一個饅頭波,所以希望誤差信號erri越小越好。

yi=yi+(3400.*erri+ui)*Ts/2.;//是誤差電流信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為3400),誤差電流信號是有正有負的,是一個不斷調節的過程,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸入電流和參考電流值相差不大,是自己想要的電流;

Vm=yi+0.3*erri;//這句話我猜0.3是比例系數,這里就是加上了電流誤差信號的比例量,這個值是最后的控制信號,相當于下圖的u(t),用這個值計算占空比的大小;

以上是內部電流環的PI控制器算法;


npulse_next=Ncount * (Vm/Vcarr);//這句話就是用來計算占空比的,也就是脈沖寬度;npulse_next/Ncount=Vm/Vcarr,通過這個比例式理解這個占空比計算公式。

okay,算法基本都看懂了。

1
回復
2016-10-31 12:20
@郭偉郭偉100
基于梯形積分PI控制的LED反激式開關電源的研究_孫大洋.pdf看一下這個文章,來更好的理解梯形積分吧。。。[圖片]//CalculatetheouterloopPIcontrollerusingTrapezoidalRuleerrv=Voref-Vo;yv=yv+(33.33*errv+uv)*Ts/2.;iref=(errv+yv)*Va;//CalculatetheinnerloopPIcontrollererri=iref-iL;yi=yi+(3400.*erri+ui)*Ts/2.;Vm=yi+0.3*erri;這段就是梯形積分的算法程序errv=Voref-Vo;//是指誤差電壓=輸出參考電壓-采樣輸出電壓;errv是誤差電壓信號;yv=yv+(33.33*errv+uv)*Ts/2.;//是誤差電壓信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為33.33),誤差電壓信號是有正有負的,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸出電壓和參考電壓相差不大,是自己想要的電壓;iref=(errv+yv)*Va;//這是一個輸出由監視功能的電感電流量,ires和誤差電壓信號errv、誤差電壓信號的積分累計量yv、采樣的輸入電壓的絕對值Va都有關系。Va的絕對值是一個饅頭波,所以iref也是饅頭波。以上是外部電壓環的PI控制器算法;erri=iref-iL;//iL是采樣的輸入電流,功率因數校正就是希望iL的波形跟隨輸入電壓的變化而變化,也是一個饅頭波,iref就是一個饅頭波,所以希望誤差信號erri越小越好。yi=yi+(3400.*erri+ui)*Ts/2.;//是誤差電流信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為3400),誤差電流信號是有正有負的,是一個不斷調節的過程,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸入電流和參考電流值相差不大,是自己想要的電流;Vm=yi+0.3*erri;//這句話我猜0.3是比例系數,這里就是加上了電流誤差信號的比例量,這個值是最后的控制信號,相當于下圖的u(t),用這個值計算占空比的大小;[圖片]以上是內部電流環的PI控制器算法;npulse_next=Ncount*(Vm/Vcarr);//這句話就是用來計算占空比的,也就是脈沖寬度;npulse_next/Ncount=Vm/Vcarr,通過這個比例式理解這個占空比計算公式。okay,算法基本都看懂了。
這個電路應該大家都懂,就是一個BOOST變換器的功率因數校正電路。以上有不對的,歡迎指導我這個小菜鳥,接下來,看懂了電路和程序,心理踏實了,從第一步開始,看看怎么在PSIM仿真軟件中建立DLL模塊吧。嘿嘿。。。。小菜鳥就是一步一步來
0
回復
2016-10-31 12:26
@郭偉郭偉100
這個電路應該大家都懂,就是一個BOOST變換器的功率因數校正電路。以上有不對的,歡迎指導我這個小菜鳥,接下來,看懂了電路和程序,心理踏實了,從第一步開始,看看怎么在PSIM仿真軟件中建立DLL模塊吧。嘿嘿。。。。小菜鳥就是一步一步來

先分享一個好的帖子,同學朋友推薦給我的,說我可以參考一下。。。學起來

http://blog.csdn.net/zhanghy_80/article/details/6431427

0
回復
2016-10-31 12:29
@郭偉郭偉100
先分享一個好的帖子,同學朋友推薦給我的,說我可以參考一下。。。學起來[圖片]http://blog.csdn.net/zhanghy_80/article/details/6431427
0
回復
2016-10-31 12:47
@郭偉郭偉100
VC++動態鏈接庫創建和調用全過程詳解.pdf
打開dsw文件,看看長什么樣子:

就是下圖的樣子:嘿嘿

0
回復
2016-11-01 10:56
帖子已被設置為頭條,恭喜樓主可添加電源網私人官網微信(dianyuan_com)為好友,領取現金紅包(備注信息:頭條紅包)

      注:現金紅包僅限當日領取

      活動介紹:http://www.daogou-taobao.cn/bbs/1531738.html

     

0
回復
2016-11-01 14:52
@郭偉郭偉100
打開dsw文件,看看長什么樣子:[圖片]就是下圖的樣子:嘿嘿[圖片][圖片]

我的C語言基礎實在是太差了,所以看這個例程的外部依賴項的頭文件的時候,腦子暈暈的,就是除了.cpp文件之外的一些.h文件?好想哭

昨天總結了一些基礎的(如下word文檔):

C語言符號.docx

2
回復
2016-11-01 14:53
@電源網-fqd
帖子已被設置為頭條,恭喜樓主可添加電源網私人官網微信(dianyuan_com)為好友,領取現金紅包(備注信息:頭條紅包)     注:現金紅包僅限當日領取     活動介紹:http://www.daogou-taobao.cn/bbs/1531738.html     [圖片]
太開心了,謝謝,已加微信,快同意。哈哈
0
回復
2016-11-02 11:43
@郭偉郭偉100
我的C語言基礎實在是太差了,所以看這個例程的外部依賴項的頭文件的時候,腦子暈暈的,就是除了.cpp文件之外的一些.h文件?[圖片]好想哭昨天總結了一些基礎的(如下word文檔):C語言符號.docx
最一般的DLL,即非MFC DLL。
1
回復
2016-11-02 11:46
@郭偉郭偉100
最一般的DLL,即非MFCDLL。
**此帖已被管理員刪除**
1
回復
2016-11-02 11:47
@郭偉郭偉100
**此帖已被管理員刪除**
經過加殼的.Net程序在使用IL反匯編工具進行查看時,將會提示“沒有有效CLR頭,無法反匯編”。
1
回復
2016-11-02 11:51
@郭偉郭偉100
經過加殼的.Net程序在使用IL反匯編工具進行查看時,將會提示“沒有有效CLR頭,無法反匯編”。
動態鏈接庫中的導出接口可以使用Visual C++的Depends工具進行查看
1
回復
2016-11-02 11:55
@郭偉郭偉100
動態鏈接庫中的導出接口可以使用VisualC++的Depends工具進行查看

打開例程中的DLL文件,如圖所示:

0
回復
2016-11-03 12:29
@郭偉郭偉100
打開例程中的DLL文件,如圖所示:[圖片]

VC2010靜態鏈接庫的生成:

(標準Turbo C2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。


第一步:打開Microsoft Visual Studio 2010,雙擊下圖圖標


第二步:新建一個項目:文件→新建→項目→win32項目(自己輸入項目名稱為static)→點擊“下一步”→選擇“靜態庫”,不選附加選項中的預編譯頭→點擊“完成”。


第三步:在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cpp

static.h文件:

#ifndef LIB_H
#define LIB_H

	extern "C" int sum(int a,int b);
	extern "C" int substract(int a,int b); 
#endif

static.cpp文件:
#include "static.h"

int sum(int a,int b)
{
	return a+b;
}
int substract(int a,int b)
{
	return a-b;
}
 
生成→編譯→生成test,之后會在你保存項目的文件下發現一個debug文件夾,里面就是你生成static.lib文件,這個就是我們需要的靜態鏈接庫。


第四步:以上三步已經生成了靜態鏈接庫,下面就是講一下如何調用這個靜態鏈接庫:

文件→新建→項目→選擇“空項目”,命名為static1→點擊“確定”

然后將之前static項目下的static.h和static.lib這個2個文件復制到static1項目的目錄下,并在工程中加入static.h文件。

新建一個static1.cpp文件如下:
#include "static.h"
#include 
#include 

#pragma comment(lib,"static.lib")

int main()
{
	printf("%d\n",sum(1,2));
	printf("%d\n",substract(4,3));
	system("pause");
	return 0;
}


 第五步:編譯,運行可得到結果。

0
回復
2016-11-03 12:32
@郭偉郭偉100
VC2010靜態鏈接庫的生成:(標準TurboC2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。)第一步:打開MicrosoftVisualStudio2010,雙擊下圖圖標[圖片]第二步:新建一個項目:文件→新建→項目→win32項目(自己輸入項目名稱為static)→點擊“下一步”→選擇“靜態庫”,不選附加選項中的預編譯頭→點擊“完成”。[圖片]第三步:在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cppstatic.h文件:#ifndefLIB_H#defineLIB_Hextern"C"intsum(inta,intb);extern"C"intsubstract(inta,intb);#endifstatic.cpp文件:#include"static.h"intsum(inta,intb){returna+b;}intsubstract(inta,intb){returna-b;}生成→編譯→生成test,之后會在你保存項目的文件下發現一個debug文件夾,里面就是你生成static.lib文件,這個就是我們需要的靜態鏈接庫。[圖片]第四步:以上三步已經生成了靜態鏈接庫,下面就是講一下如何調用這個靜態鏈接庫:文件→新建→項目→選擇“空項目”,命名為static1→點擊“確定”然后將之前static項目下的static.h和static.lib這個2個文件復制到static1項目的目錄下,并在工程中加入static.h文件。[圖片]新建一個static1.cpp文件如下:#include"static.h"#include#include#pragmacomment(lib,"static.lib")intmain(){printf("%d\n",sum(1,2));printf("%d\n",substract(4,3));system("pause");return0;}[圖片]第五步:編譯,運行可得到結果。[圖片]
調用庫的時候,千萬注意,新建的項目不能還按照第一步建立靜態庫的步驟來,不然會出現這樣的錯誤,昨天一直沒悟過來,浪費時間!!!!

0
回復
2016-11-03 14:35
@郭偉郭偉100
VC2010靜態鏈接庫的生成:(標準TurboC2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。)第一步:打開MicrosoftVisualStudio2010,雙擊下圖圖標[圖片]第二步:新建一個項目:文件→新建→項目→win32項目(自己輸入項目名稱為static)→點擊“下一步”→選擇“靜態庫”,不選附加選項中的預編譯頭→點擊“完成”。[圖片]第三步:在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cppstatic.h文件:#ifndefLIB_H#defineLIB_Hextern"C"intsum(inta,intb);extern"C"intsubstract(inta,intb);#endifstatic.cpp文件:#include"static.h"intsum(inta,intb){returna+b;}intsubstract(inta,intb){returna-b;}生成→編譯→生成test,之后會在你保存項目的文件下發現一個debug文件夾,里面就是你生成static.lib文件,這個就是我們需要的靜態鏈接庫。[圖片]第四步:以上三步已經生成了靜態鏈接庫,下面就是講一下如何調用這個靜態鏈接庫:文件→新建→項目→選擇“空項目”,命名為static1→點擊“確定”然后將之前static項目下的static.h和static.lib這個2個文件復制到static1項目的目錄下,并在工程中加入static.h文件。[圖片]新建一個static1.cpp文件如下:#include"static.h"#include#include#pragmacomment(lib,"static.lib")intmain(){printf("%d\n",sum(1,2));printf("%d\n",substract(4,3));system("pause");return0;}[圖片]第五步:編譯,運行可得到結果。[圖片]

#pragma comment(lib,"static.lib"),這一句是顯式的導入靜態鏈接庫。


解析#pragma指令 

在所有的預處理指令中,#Pragma 指令可能是最復雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。

#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統專有的特征。依據定義,編譯指示是機器或操作系統專有的,且對于每個編譯器都是不同的。

其格式一般為: #Pragma Para其中Para 為參數,下面來看一些常用的參數。


(1)message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。

其使用方法為:#Pragma message(“消息文本”)

當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法

#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif

當我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了


(2)另一個使用得比較多的pragma參數是code_seg。

格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )

它能夠設置程序中函數代碼存放的代碼段,當我們開發驅動程序的時候就會使用到它。


(3)#pragma once (比較常用)只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到兼容性并沒有太多的使用它。


(4)#pragma hdrstop表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。 

有時單元之間有依賴關系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優先級,如果使用了#pragma package(smart_init) ,BCB就會根據優先級的大小先后編譯。 


(5)#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。 


(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )

等價于:

#pragma warning(disable:4507 34) // 不顯示4507和34號警告信息
#pragma warning(once:4385) // 4385號警告信息僅報告一次
#pragma warning(error:164) // 把164號警告信息作為一個錯誤。
同時這個pragma warning 也支持如下格式: 

#pragma warning( push [ ,n ] )
#pragma warning( pop ) 

 這里n代表一個警告等級(1---4)。

#pragma warning( push, n)保存所有警告信息的現有的警告狀態,并且把全局警告等級設定為n。 

#pragma warning( pop )向棧中彈出最后一個警告信息,在入棧和出棧之間所作的一切改動取消。例如:

#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
 在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。

(7)pragma comment(...)該指令將一個注釋記錄放入一個對象文件或可執行文件中。常用的lib關鍵字,可以幫我們連入一個庫文件。

0
回復
2016-11-03 14:51
@郭偉郭偉100
VC2010靜態鏈接庫的生成:(標準TurboC2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。)第一步:打開MicrosoftVisualStudio2010,雙擊下圖圖標[圖片]第二步:新建一個項目:文件→新建→項目→win32項目(自己輸入項目名稱為static)→點擊“下一步”→選擇“靜態庫”,不選附加選項中的預編譯頭→點擊“完成”。[圖片]第三步:在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cppstatic.h文件:#ifndefLIB_H#defineLIB_Hextern"C"intsum(inta,intb);extern"C"intsubstract(inta,intb);#endifstatic.cpp文件:#include"static.h"intsum(inta,intb){returna+b;}intsubstract(inta,intb){returna-b;}生成→編譯→生成test,之后會在你保存項目的文件下發現一個debug文件夾,里面就是你生成static.lib文件,這個就是我們需要的靜態鏈接庫。[圖片]第四步:以上三步已經生成了靜態鏈接庫,下面就是講一下如何調用這個靜態鏈接庫:文件→新建→項目→選擇“空項目”,命名為static1→點擊“確定”然后將之前static項目下的static.h和static.lib這個2個文件復制到static1項目的目錄下,并在工程中加入static.h文件。[圖片]新建一個static1.cpp文件如下:#include"static.h"#include#include#pragmacomment(lib,"static.lib")intmain(){printf("%d\n",sum(1,2));printf("%d\n",substract(4,3));system("pause");return0;}[圖片]第五步:編譯,運行可得到結果。[圖片]

extern "C"的主要作用就是為了能夠正確實現C++代碼調用其他C語言代碼。加上extern "C"后,會指示編譯器這部分代碼按C語言的進行編譯,而不是C++的。由于C++支持函數重載,因此編譯器編譯函數的過程中會將函數的參數類型也加到編譯后的代碼中,而不僅僅是函數名;而C語言并不支持函數重載,因此編譯C語言代碼的函數時不會帶上函數的參數類型,一般只包括函數名。

例如,假設某個函數的原型為:

void foo( int x, int y );

該函數被C編譯器編譯后在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。

_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。 例如,在C++中,函數void foo( int x, int y )與void foo( int x, float y )編譯生成的符號是不相同的,后者為_foo_int_float。

0
回復
2016-11-08 18:21
@郭偉郭偉100
DLL模塊有小圓圈的一頭從上往下依次是in[0],[1],[2]和out[0],[1],[2]……[圖片][圖片]

在PSIM電路中,不用的輸入口一定要接地,不用的輸出口懸空即可。

比如你用PSIM中的DLL模塊,實驗中需要設置4個輸入端,9個輸出端,那么你可以用12input的DLL模塊,不用的輸入口一接地,不用的輸出口懸空即可。

或者你可以用Eelements→other→General DLL Block,自行設置輸入、輸出量個數。

0
回復
2017-09-02 17:01
@郭偉郭偉100
太開心了,謝謝,已加微信,快同意。哈哈[圖片]
我也是PSIM初學者,很開心看到這么詳細的帖子,姐姐好厲害
0
回復
2019-07-06 13:56
@郭偉郭偉100
(4)外置DLL功能塊,需要用C語言或者C++編程,然后用PSIM連接起來。所以要安裝MicrosoftVisualC++2010。。找師姐要的安裝包,按照《VisualStudio2010安裝實戰教程》的步驟安裝的。安裝好之后,寫了一個printf("HELLO\n");的程序,仿真出錯,提示錯誤原因是:LINK--fatal-error-LNK1123-轉換到-COFF-期間失敗-文件無效或損壞-還有warning-C4996。可百度解決該問題,替換一個文件即可。。。。(備注有說方法。)[圖片]當然我也是C語言初學者,哈哈,之后可能看程序需要一句一句查了。。。勿噴。么么噠。我是弱女子。哈哈[圖片]備注:在電腦里面搜索發現路徑1:C:\ProgramFiles\MicrosoftVisualStudio10.0\VC\bin (說明:我的安裝目錄是在D盤,所以我找的是D盤里面的D:\MicrosoftVisualC++2010\VC\bin)路徑2:C:\Windows\winsxs\x86_netfxcvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7600.16385_none_ba476986f05abc65(說明:我在我的電腦的C:\Windows\winsxs路徑下找到這三個文件,三個里面都有cvtres.exe文件,我找了一個最新的去替代上面路徑中的cvtres.exe文件)[圖片]路徑3:C:\Windows\Microsoft.NET\Framework\v4.0.30319這三個路徑里面都有cvtres.exe文件,嘗試使用第二個路徑里面的文件替換第一個路徑的文件,問題解決。(這個問題是windows自動更新造成編譯器cvtres.exe的版本過低,如果windows再次更新,則還可能出現這樣的問題,屆時再重復一下上述步驟即可。)
樓主很棒啊,說的很詳細。正好我也要學,仔細看看~
0
回復
vugi
LV.1
31
2020-03-10 17:30
@郭偉郭偉100
基于梯形積分PI控制的LED反激式開關電源的研究_孫大洋.pdf看一下這個文章,來更好的理解梯形積分吧。。。[圖片]//CalculatetheouterloopPIcontrollerusingTrapezoidalRuleerrv=Voref-Vo;yv=yv+(33.33*errv+uv)*Ts/2.;iref=(errv+yv)*Va;//CalculatetheinnerloopPIcontrollererri=iref-iL;yi=yi+(3400.*erri+ui)*Ts/2.;Vm=yi+0.3*erri;這段就是梯形積分的算法程序errv=Voref-Vo;//是指誤差電壓=輸出參考電壓-采樣輸出電壓;errv是誤差電壓信號;yv=yv+(33.33*errv+uv)*Ts/2.;//是誤差電壓信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為33.33),誤差電壓信號是有正有負的,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸出電壓和參考電壓相差不大,是自己想要的電壓;iref=(errv+yv)*Va;//這是一個輸出由監視功能的電感電流量,ires和誤差電壓信號errv、誤差電壓信號的積分累計量yv、采樣的輸入電壓的絕對值Va都有關系。Va的絕對值是一個饅頭波,所以iref也是饅頭波。以上是外部電壓環的PI控制器算法;erri=iref-iL;//iL是采樣的輸入電流,功率因數校正就是希望iL的波形跟隨輸入電壓的變化而變化,也是一個饅頭波,iref就是一個饅頭波,所以希望誤差信號erri越小越好。yi=yi+(3400.*erri+ui)*Ts/2.;//是誤差電流信號的積分累積量(這里就是梯形積分,比例系數為0,積分系數為3400),誤差電流信號是有正有負的,是一個不斷調節的過程,我們希望它的值最后趨于一個穩定值,這個穩定值是一個很小的數,此時就說明輸入電流和參考電流值相差不大,是自己想要的電流;Vm=yi+0.3*erri;//這句話我猜0.3是比例系數,這里就是加上了電流誤差信號的比例量,這個值是最后的控制信號,相當于下圖的u(t),用這個值計算占空比的大小;[圖片]以上是內部電流環的PI控制器算法;npulse_next=Ncount*(Vm/Vcarr);//這句話就是用來計算占空比的,也就是脈沖寬度;npulse_next/Ncount=Vm/Vcarr,通過這個比例式理解這個占空比計算公式。okay,算法基本都看懂了。
樓主有些不懂,還在嗎
0
回復
主站蜘蛛池模板: 精品国产一区二区三区久久狼5月 | 最近日本MV字幕免费观看 | 亚洲免费中文字幕 | 亚洲乱码一二三四区 | 一区二区三区精品视频免费看 | 大肉大捧一进一出好爽 | 日韩二区三区四区 | 国产鲁鲁视频在线观看 | 97精品在线观看 | 美女扒了内裤让男人桶 | 逼特逼视频在线 | 无码国产精品一区二区免费16 | 天天色天天看 | 欧美日韩精品成人网视频 | www在线免费观看欧美黄 | 久久久乱码精品亚洲日韩mv | 国产精品一区视频网站 | 亚洲第一成人久久网站 | 久草麻豆 | 一区视频免费观看 | 最新国产一区二区 | 欧美亚洲另类在线观看 | 久久久女人视频 | 亚洲AV无码专区亚洲AV网站 | 日韩国产一区二区 | 青苹果乐园免费高清资源 | 91视频porny| 亚洲精品久久久久无码精品 | 99精品偷拍视频一区二区三区 | 2021国产精品成人免费视频 | 国产香蕉伊蕉伊中文在线视频 | 岳好紧好湿夹太紧了好爽 | 国产精品中文字幕在线观看 | 成人免费在线网站 | 99久久综合国产精品二区国产 | 精品永久久福利一区二区 | 真人一级毛片视频 | 人人妻人人爽人人做夜欢视频九色 | 午夜国产一区二区三区 | 久久久性| 亚洲成a人片777777久久 |