• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

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.dianyuan.com/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.dianyuan.com/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
回复